Dgango 外键关联查询

·  阅读 288

业务需求: 当我们查询子表时想要获取到子表关联的主表数据,或者我们需要查询主表下某个子表所有对应主表记录的数据。 功能拆分:

  1. 创建一个具备外键关联主表的子表 Comment,子表关联查询主表。
class Comment(models.Model):
    """
        product_id: 对应商品id
        p_comment_id: 追加评价时对应 评价 id
        info: 评价的文本
        u_id:评论人 id
    """
    def __str__(self):
        return self.info
    class Meta:
        verbose_name = "评价"
        verbose_name_plural = verbose_name
    product_id = models.IntegerField(default=0)
    p_comment_id = models.IntegerField(default=0)
    info = models.CharField(max_length=500)
    u_id = models.IntegerField(default=0)
    good = models.ForeignKey(Good,on_delete=CASCADE,default=0)
    create_time = models.DateTimeField(default=datetime.datetime.now())
    create_name = models.CharField(max_length=20)
    update_time = models.DateTimeField(default=datetime.datetime.now())
    update_name = models.CharField(max_length=20)
    is_delete = models.IntegerField(default=0) # 逻辑删除 0 正常 1:删除
复制代码

下面这行在子表中创建了一个名为 good的外键字段关联主表主键:

 good = models.ForeignKey(Good,on_delete=CASCADE,default=0)
复制代码

on_delete=CASCADE 表示当删除主表记录时,同步删除所有外键关联该记录的子表数据

执行

1. python3 manage.py makemigrations
2. python3 manage.py migrate
复制代码

在数据库中生成一个如下的外键字段:

image.png 创建几条模拟数据,接下来我们执行子表查询操作,返回结果如下

image.png

此时外键字段展示的是一个主表主键的id而不是具体信息。 如果我们希望子表查询时返回主表的详细信息,可以在序列化时坐下修改:

#评价序列化类
class CommentSerializer(serializers.ModelSerializer):
     
    class Meta:
        # 对Good进行序列化
        model = Comment
        # __all__表示对 Comment 中所有字段序列化进行序列化
        fields = '__all__'
        depth = 1 # 若有外键,默认只返回外键id ,设为1 可展示外键所有字段
复制代码

此处添加depth = 1 # 若有外键,默认只返回外键id ,设为1 可展示外键所有字段,是查询返回外键加深一层的主表数据。 此时返回:

image.png 这里关联主表的id就变成了详细的主表信息。

2.子表能查询到主表的数据了 ,接下来我们希望直接获取主表Good记录下所有外键关联的Comment记录。 这里有个简单的方式,比如我们主表下有外键关联主表的名为 Comment的子表,我们可以通过子表名 ‘comment’+'_set'来拿到对应主表记录的外键关联子表记录:

eg. ret = Good.objects.first().comment_set.all() 如上就可以拿到good表第一条数据所有外键关联的 comment表记录。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改