如何与django一起添加两个sql列?

时间:2014-03-18 16:18:02

标签: python sql django

我有两个数据库表,故事和故事投票,我希望以最高票数提取有关故事的信息。理论上我应该相当容易,但我构建数据库表的方式可能会使它变得更复杂(尽管它仍然可以改变它的结构)。

两个数据库表的设计方式如下:

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."

所有帮助都是适当的。

1 个答案:

答案 0 :(得分:0)

按照您想要的问题说明进行操作:

  1. 获取具有最大投票数的StoryType。
  2. 获取相应故事的详细信息。
  3. 这就是你要做的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。只是一个想法,因为我不知道您的代码的设计。