业务需求:
当我们查询子表时想要获取到子表关联的主表数据,或者我们需要查询主表下某个子表所有对应主表记录的数据。
功能拆分:
- 创建一个具备外键关联主表的子表 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
复制代码
在数据库中生成一个如下的外键字段:
创建几条模拟数据,接下来我们执行子表查询操作,返回结果如下
此时外键字段展示的是一个主表主键的id而不是具体信息。
如果我们希望子表查询时返回主表的详细信息,可以在序列化时坐下修改:
#评价序列化类
class CommentSerializer(serializers.ModelSerializer):
class Meta:
# 对Good进行序列化
model = Comment
# __all__表示对 Comment 中所有字段序列化进行序列化
fields = '__all__'
depth = 1 # 若有外键,默认只返回外键id ,设为1 可展示外键所有字段
复制代码
此处添加depth = 1 # 若有外键,默认只返回外键id ,设为1 可展示外键所有字段
,是查询返回外键加深一层的主表数据。
此时返回:
这里关联主表的id就变成了详细的主表信息。
2.子表能查询到主表的数据了 ,接下来我们希望直接获取主表Good记录下所有外键关联的Comment记录。
这里有个简单的方式,比如我们主表下有外键关联主表的名为 Comment的子表,我们可以通过子表名 ‘comment’+’_set’来拿到对应主表记录的外键关联子表记录:
eg. ret = Good.objects.first().comment_set.all()
如上就可以拿到good表第一条数据所有外键关联的 comment表记录。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END