我不知道如何通过一种查询集类型来处理多对多关系
I don't know how to through one queryset type to manytomany relations
我想用 Django 写博客system.But问题是我无法从文章查询集中获取标签查询集。
型号:
class Article(models.Model):
...
tags = models.ManyToManyField(Tags,related_name='tags')
author = models.ForeignKey(
User,on_delete=models.CASCADE,to_field="username",
)
...
class Tags(models.Model):
tag_name = models.CharField(max_length=20)
def __str__(self):
return self.tag_name
class Profile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,to_field='username',)
...
观看次数:
....
def get_context_data(self,**kwargs):
user=self.request.user
object_list=Article.objects.all().filter(author=self.request.user.username).order_by(F('created').desc())[:100]
kwargs['tags']=??? # I want to get a tags queryset related to object_list
return super(UserIndexView,self).get_context_data(**kwargs)
您使用的 related_name
有误。 related_name
是反向关系的名称。应该是:
tags = models.ManyToManyField(Tags,related_name='articles')
所以您的问题的简单答案是使用:
[article.tags.all() for article in object_list]
但这效率不高,因为它向数据库发出了 100 个单独的查询。
更好的方法是:
Tags.objects.filter(articles__author=self.request.user.username)
(注意使用related_name
属性)
但是我省略了有趣的部分,即只获取与用户最新的100篇文章相关的标签。为此,我认为最好的方法是先获取第100篇文章的日期,然后进行相应的过滤:
ordered_articles = Article.objects.filter(author=self.request.user.username).order_by(F('created').desc()
try:
date_limit = ordered_articles[100].created
return Tags.objects.filter(articles__author=self.request.user.username, articles__created__lt=date_limit)
except IndexError:
return Tags.objects.filter(articles__author=self.request.user.username)
(答案未经测试,抱歉)
此外,将您的模型命名为 Tag
而不是 Tags
。
我想用 Django 写博客system.But问题是我无法从文章查询集中获取标签查询集。
型号:
class Article(models.Model):
...
tags = models.ManyToManyField(Tags,related_name='tags')
author = models.ForeignKey(
User,on_delete=models.CASCADE,to_field="username",
)
...
class Tags(models.Model):
tag_name = models.CharField(max_length=20)
def __str__(self):
return self.tag_name
class Profile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,to_field='username',)
...
观看次数:
....
def get_context_data(self,**kwargs):
user=self.request.user
object_list=Article.objects.all().filter(author=self.request.user.username).order_by(F('created').desc())[:100]
kwargs['tags']=??? # I want to get a tags queryset related to object_list
return super(UserIndexView,self).get_context_data(**kwargs)
您使用的 related_name
有误。 related_name
是反向关系的名称。应该是:
tags = models.ManyToManyField(Tags,related_name='articles')
所以您的问题的简单答案是使用:
[article.tags.all() for article in object_list]
但这效率不高,因为它向数据库发出了 100 个单独的查询。 更好的方法是:
Tags.objects.filter(articles__author=self.request.user.username)
(注意使用related_name
属性)
但是我省略了有趣的部分,即只获取与用户最新的100篇文章相关的标签。为此,我认为最好的方法是先获取第100篇文章的日期,然后进行相应的过滤:
ordered_articles = Article.objects.filter(author=self.request.user.username).order_by(F('created').desc()
try:
date_limit = ordered_articles[100].created
return Tags.objects.filter(articles__author=self.request.user.username, articles__created__lt=date_limit)
except IndexError:
return Tags.objects.filter(articles__author=self.request.user.username)
(答案未经测试,抱歉)
此外,将您的模型命名为 Tag
而不是 Tags
。