在foreignkey上使用_set不起作用

时间:2014-02-23 21:05:04

标签: python sql django

我已经阅读了docs和stackoverflow,但是我无法弄清楚为什么我的外键不能正常工作,django只是说没有像vote_story_set.all()这样的属性。

我有一个名为story的表和一个名为vote_story的表,故事表有几个外键,例如foreign to vote_story来获取新闻报道的投票数。

根据这里的文档和详细答案:*_set attributes on Django Models我创建了一个这样的对象:

all_stories = Story.objects.all()
votes = all_stories.vote_story_set.all()

但这不起作用,因为django说没有“vote_story_set”这样的属性。故事的数据库表具有'votes'属性作为表Votes_story的外键。从我看到的例子应该是这样的,所以我不明白为什么它没有。 Votes_story表中没有外键,只有一个主键和包含投票数的属性'votes'。

更新: 模型和模板如下所示为Story和Vote_story以及相关视图。

型号:

class Story(models.Model):
    story_id = models.IntegerField(primary_key=True)
    date_added = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
    title = models.CharField(max_length=150)
    description = models.CharField(blank=True, null=True, max_length=2000)
    story_text = models.TextField()
    picture = models.ImageField(blank=True, null=True, upload_to="story/images")
    storyAccessLevelID = models.ForeignKey(StoryAccessLevel)
    categoryID = models.ForeignKey(Category)
    votes = models.ForeignKey(Vote_story, blank=True, null=True)
    comments = models.ForeignKey(Comment, blank=True, null=True)

   def __unicode__(self):
        return self.title

class Vote_story(models.Model):
    votes = models.IntegerField()

    def __unicode__(self):
        return self.votes

在文件中,Vote_story定义在Story之上,因此它可以找到它。 在Vote_story中,我让django自动创建主键,而不像Story。 目前对其中一个故事投了一票。

模板代码(相关部分):

<table class="table table-hover">
    <thead>
        <tr>
            <th>Title</th>
            <th>Description</th>
            <th>Date added</th>
            <th>Votes</th>
            <th>Comments</th>
        </tr>
    </thead>
    <tbody>
        {% for story in all_stories %}
        <tr>
            <td><a href="/story/details/{{ story.story_id }}">{{ story.title }}</a></td>
            <td>{{ story.description }}</td>
            <td>{{ story.date_added }}</td>
            <td>{{ story.votes }}</td>
            <td>{{ story.comments }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>

视图是这样的:

def list_all_stories(request):
    """ Show all stories """
    all_stories = Story.objects.all()
    return render(request, "base/story/all_stories.html", {'all_stories': all_stories})

1 个答案:

答案 0 :(得分:2)

all_stories是一个查询集,而不是一个实例。 vote_story_set是查询集中每个实例的属性,而不是查询集本身。

另外,你似乎对关系的方向感到困惑。如果你的ForeignKey从Vote转到VoteStory,你不需要反向关系,你需要前向的,这就是你所谓的领域。但是,这仍然是每个实例的属性,而不是查询集。