我有两个数据库表,故事和故事投票,我希望以最高票数提取有关故事的信息。理论上我应该相当容易,但我构建数据库表的方式可能会使它变得更复杂(尽管它仍然可以改变它的结构)。
两个数据库表的设计方式如下:
class Story(models.Model):
user = models.ForeignKey(User)
date_added = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)
location = models.CharField(max_length=100)
title = models.CharField(max_length=150)
description = models.CharField(blank=True, null=True, max_length=2000)
story_text = models.TextField()
def __unicode__(self):
return self.title
class StoryVote(models.Model):
votes = models.IntegerField()
story_vote_type = models.CharField(max_length=100)
story = models.ForeignKey(Story, related_name="votes")
def __unicode__(self):
return self.votes
从上面的模型中可以看出,我有一个名为“story_vote_type”的列,它是“向上”或“向下”。 例如,这不会起作用:
for story in s:
print story.title + " has " + str(story.votes.all().count()) + " votes."
如果我过滤掉这个,我必须指定“story_vote_type = up”或“story_vote_type = down”,然后我不知道我应该如何存储结果并将它们加在一起。
我如何在这里为特定故事添加upvotes和downvotes?
到目前为止,我有这个代码将数字加在一起:
for story in s:
... votes = story.votes.all()
... title = story.title
... specific_votes = 0
... for vote in votes:
... if (title == story.title and vote.story_vote_type == "up"):
... specific_votes = vote.votes + specific_votes
... else:
... specific_votes = vote.votes + specific_votes
... print story.title + " has " + str(specific_votes) + " votes."
所有帮助都是适当的。
答案 0 :(得分:0)
按照您想要的问题说明进行操作:
这就是你要做的1:
from django.db.models import Max, F
res = StoryVote.objects.annotate(max_votes=Max('votes')).filter(current_price=F('max_votes'))
这是你如何提高1来获得2:
res = StoryVote.objects.select_related('storyVote__story').annotate(max_votes=Max('votes')).filter(current_price=F('max_votes'))
至于为特定故事添加upvotes和downvotes,我认为更好的方法是在Story
中为StoryType
提供upvote_count和downvote_count。只是一个想法,因为我不知道您的代码的设计。