我的模特是:
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
这是可能的,谢谢!
答案 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()