Dgango 外键关联查询

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

  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表记录。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值