在DRF序列化器中使用Django模型管理器进行通用关系

时间:2018-07-27 17:05:16

标签: python django python-3.x django-rest-framework

我正在努力在序列化器中使用model.Manager。 假设我的模型:

class Report(models.Model):
    name = models.TextField()
    ...
    votes = GenericRelation(Vote, related_query_name='reports')

和我的投票模型和模型管理器(喜欢/不喜欢/可以):

class VoteEnum(ChoiceEnum):
    Like = 'Like'
    Dislike = 'Dislike'
    Okay = 'Okay'


class VoteManager(models.Manager):
    use_for_related_fields = True

    def likes(self):
        return self.get_queryset().filter(vote=VoteEnum.Like.name)

    def dislikes(self):
        return self.get_queryset().filter(vote=VoteEnum.Dislike.name)

    def okays(self):
        return self.get_queryset().filter(vote=VoteEnum.Okay.name)

    def reports(self):
        return self.get_queryset().filter(content_type__model='report')
    # don't pay attention to `enum.name` here

class Vote(models.Model):

    vote = models.CharField(verbose_name="Vote", choices=VoteEnum.choices(), max_length=30)
    user = models.ForeignKey(User, verbose_name="User")
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()
    objects = VoteManager()

所以,我想要什么: 在我的Report序列化程序中,我想返回likes/dislikes的数量,而不必为报表实例添加其他属性:

 def likes_count(self, report):
        return (Vote.objects.filter(report=report, vote='Dislike').count())      

但是要使用在我的VoteManager类中定义的方法。可能吗?

当然,我可以保持原样,但是我担心这种方法的性能会受到影响(对于3个属性,我必须进行3次过滤...),而且我并不急于复制此类属性我想要为其添加投票的每个模型。那太恶心了,我正在努力避免这种复制/粘贴。

我敢打赌,几乎有现成的方式可以做这种事情。请你帮助我好吗? 检查了thisthis,但不能完全解决我的问题。 预先感谢!

0 个答案:

没有答案