我已经阅读了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})
答案 0 :(得分:2)
all_stories
是一个查询集,而不是一个实例。 vote_story_set
是查询集中每个实例的属性,而不是查询集本身。
另外,你似乎对关系的方向感到困惑。如果你的ForeignKey从Vote转到VoteStory,你不需要反向关系,你需要前向的,这就是你所谓的领域。但是,这仍然是每个实例的属性,而不是查询集。