django关联查询,反向关联查询

django的关联查询和反向关联查询

models.py文件 class Article(models.Model): """测试各种字段""" title = models.CharField(max_length=32, null=False, verbose_name='标题', help_text='标题') cover = models.ImageField(upload_to='cover/', verbose_name='封面', help_text='封面') add = models.DateTimeField(auto_now_add=True, null=False, verbose_name='添加时间', help_text='添加时间') class Meta: verbose_name_plural = verbose_name = '文章' db_table = 'article' def str(self): return self.title class Comment(models.Model): """评论表""" article = models.ForeignKey(to=Article, on_delete=models.CASCADE, verbose_name='所属文章', help_text='所属文章') comment = models.TextField(max_length=300, null=True, verbose_name='评论', help_text='评论') created = models.DateTimeField(auto_now_add=True, editable=False, verbose_name='发表于', help_text='发表于') class Meta: verbose_name_plural = verbose_name = '评论表' ordering = ['-created'] def str(self): return self.article.title

正向关联场景:比如上面的模型中我想看到我这条评论对应的文章的信息

外键指向另一个表,想要在查询其中一个表的对象时不用进行额外的查询操作,直接关联出所指向对象(不仅仅是他的id)。

反向关联场景: 比如上面的模型中一篇文章想知道她有多少条评论

被外键指向的主表中的一条记录, 想不通过额外的查询, 看看到底有哪些“跟班”指向了自己。

一,ForeignKey的正向关联。

在django中,被关联的对象成为了自己的属性 '例如,我想知道id为1的评论对应的文章的信息' comment = Comment.objects.filter(id=1).first() 文章的标题 title = comment.article.title 文章的封面 cover = comment.article.cover

二,ForeignKey的反向关联。 例如;我想知道id为1的文章下面有哪些评论 - 1,利用ForeignKey中的related_name参数。 在Comment表中的article字段,我们这样写 ... article = models.ForeignKey(to=Article, on_delete=models.CASCADE, related_name='comments', verbose_name='所属文章', help_text='所属文章') ...

在视图中我们就可以这样用

... article = Article.objects.filter(id=1).first() comments = article.comments ...

注意: 上面的article.comments中,"comments"是上面model中related_name的值。得到的是一个包含若干条comment对象的queryset.

2,利用 <表名>_set 的反向关联用法。

在models中,我们不要写related_name这个参数

... article = models.ForeignKey(to=Article, on_delete=models.CASCADE, verbose_name='所属文章', help_text='所属文章')

在视图中,我们可以这样用

... article = Article.objects.filter(id=1).first() comments = article.comment_set.all() ...

注意 :上面的_set前面的comment指的是评论表的表名小写,得到的也是一个queryset。

说明:使用_set用法时,需要特别注意三个点:

第一:两种方法不能混用,写了related_name之后就不能能用_set。 第二:_set前面的是表名(models中类名)小写。 第三:如果不写related_name,那么第一种方法是不能用的。

评论 1