我正在努力在序列化器中使用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次过滤...),而且我并不急于复制此类属性我想要为其添加投票的每个模型。那太恶心了,我正在努力避免这种复制/粘贴。
我敢打赌,几乎有现成的方式可以做这种事情。请你帮助我好吗? 检查了this和this,但不能完全解决我的问题。 预先感谢!