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

Python 如何与django一起添加两个sql列?,python,sql,django,Python,Sql,Django,我有两个数据库表,story和storyvote,我想从中提取关于投票率最高的故事的信息。理论上应该是相当容易的,但我构建数据库表的方式可能会使它更加复杂(尽管仍然有可能更改其结构) 这两个数据库表的设计方法如下: class Story(models.Model): user = models.ForeignKey(User) date_added = models.DateTimeField(auto_now_add=True) date_modified = mod

我有两个数据库表,story和storyvote,我想从中提取关于投票率最高的故事的信息。理论上应该是相当容易的,但我构建数据库表的方式可能会使它更加复杂(尽管仍然有可能更改其结构)

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

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\u vote\u type”的专栏,它是“up”或“down”。 例如,这样做不起作用:

for story in s:
    print story.title + " has " + str(story.votes.all().count()) + " votes."
如果我过滤掉这个,我必须指定“story\u vote\u type=up”或“story\u vote\u type=down”,然后我不确定应该如何存储结果并将它们相加

我如何在这里为一个特定的故事添加上升票和下降票

到目前为止,我有一个将数字相加的代码:

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的方法:

    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'))
    

    至于为一个特定的故事添加上升票和下降票,我认为更好的方法是在
    故事类型中为
    故事
    同时添加上升票和下降票。我只是想一想,因为我不知道你的代码的设计。

    你刚才添加的代码段有没有出现错误?没有,它显示了正确的信息,所以我想我所需要做的就是以某种方式将其放入dict中,但是我真的不知道如何添加一个变量作为dict键,或者这是否是一个好的解决方案1.我真的不太理解你在回答中写的内容,尽管我当然建议你花时间写一个答复,我在api中读过关于annotate的内容,但即使是文档,我认为文档中的示例和用法都不清楚,而且用法很粗糙而且不直观哦!我的答案是你问题的第一行。无论如何,您想在dict中添加此信息,以将其传递到模板,并在HTML页面上显示它?好的。嗯,这只是一个尝试,我需要做什么,但如果这是一个更好的解决方案,那么我更感兴趣的是做得更好。我将重新访问文档进行注释,但我发现您必须阅读整个指南,才能从数据库中的一列中添加两个数字,这就是我提取数据并认为可以将其存储在dict中的原因。。但这可能是一个糟糕的解决方案