Django:使用另一个ManyToMany表

时间:2017-09-26 15:10:23

标签: python django

我有3个型号:

  • django普通用户模型
  • 作者模型
  • UserAuthor模型被视为前两个模型之间的多对多关系,但带有其他字段(is_follow,review)

    class Author(models.Model):
        name = models.CharField(max_length=50)
    
    class UserAuthor(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='userauthors')
        is_follow = models.BooleanField(default=0)
        review = models.TextField(max_length=500, blank=True, null=True)
    

我的问题是如何让所有作者在每个作者中都有一个字段来表明经过身份验证的用户是否关注他。

我知道我可以使用related_name属性,该属性返回由特定作者过滤的UserAuthor管理器,以某种方式获取它但是如何?!

我的试用期是:

class AuthorListView(ListView):
    model = Author

    def get_queryset(self):
        final_list = []
        authors_list = list(Author.objects.all())
        for author in authors_list:
            element = author.userauthors.filter(user=self.request.user)
            final_list.append(element)
        return final_list

我不确定这个解决方案,但如何以更好的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

正如PeterDeGlopper在评论中所指出的,你可以使用注释:

from django.db.models import Case, When, Value, BooleanField
followed_ids = UserAuthor.objects.\
    filter(user=self.request.user, is_follow=True).\
    values_list('author_id', flat=True)
final_list = Author.objects.annotate(followed=Case(
    When(id__in=followed_ids, then=Value(True)),
    default=Value(False),
    output_field=BooleanField()
))

现在,您可以访问此查询集的每个实例的属性followed