大多数Django式的返回模型

时间:2015-11-05 23:13:15

标签: django django-models orm

我的模特是:

class DiscussionVote(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    path = models.CharField(null=False, max_length=50)

我一直在发现自己在做两个常见的查询:

DiscussionVote.objects.filter(path=request.path, user=request.user).exists()

DiscussionVote.objects.filter(path=request.path).count()

我是Django的新手,并不确定创建一个返回这两个常见查询的简单方法的最佳途径。我正在考虑的是:

DiscussionVote.objects.get_vote_count(path) // to return a number
DiscussionVote.objects.has_voted(user, path) // to return a bool

这是可能的,谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在Django(https://docs.djangoproject.com/en/1.8/topics/db/managers/#custom-managers)中实现自定义管理器,这样您就可以实现这一目标。

答案 1 :(得分:1)

是的,@ Sebastien是正确的;你也可以使用QuerySet(这样你可以链接东西)并长期重用更多的代码。它可能也不适合您的特定用例,但随着项目的增长,我发现它更好。这里有一些伪代码(未经测试):

class DiscussionVoteQuerySet(models.QuerySet):

    def by_request(self, request):
        return self.filter(path=request.path)

    def by_user(self, user): 
        return self.filter(user=user)

class DiscussionVote(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    path = models.CharField(null=False, max_length=50)

    objects = DiscussionVoteQuerySet.as_manager()

然后你可以这样做:

_count = DiscussionVote.objects.by_request(request).count()
_has_voted = DiscussionVote.objects.by_request(request).by_user(user).exists()