我不知道如何通过一种查询集类型来处理多对多关系

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