Python 从数据库层次结构中Django中的父表获取数据
在回答之后,我尝试将我的SQL故事表拆分为父级/子级-子级保存特定的用户数据,父级保存更一般的数据。现在我遇到了一个问题,这表明我在Django缺乏经验。“我的用户”页面尝试显示用户编写的所有故事的列表。以前,当我的用户页面只从故事表中提取数据时,它工作得很好。现在我需要从两个带有链接信息的表中提取数据,但我就是不知道怎么做 在尝试从父故事表中提取数据之前,以下是我的user_页面视图:Python 从数据库层次结构中Django中的父表获取数据,python,django,Python,Django,在回答之后,我尝试将我的SQL故事表拆分为父级/子级-子级保存特定的用户数据,父级保存更一般的数据。现在我遇到了一个问题,这表明我在Django缺乏经验。“我的用户”页面尝试显示用户编写的所有故事的列表。以前,当我的用户页面只从故事表中提取数据时,它工作得很好。现在我需要从两个带有链接信息的表中提取数据,但我就是不知道怎么做 在尝试从父故事表中提取数据之前,以下是我的user_页面视图: def user_page(request, username): user = get_objec
def user_page(request, username):
user = get_object_or_404(User, username=username)
userstories = user.userstory_set.order_by('-id')
variables = RequestContext(request, {
'username': username,
'userstories': userstories,
'show_tags': True
})
return render_to_response('user_page.html', variables)
这是我的models.py:
class story(models.Model):
title = models.CharField(max_length=400)
thetext = models.TextField()
class userstory(models.Model):
main = models.ForeignKey(story)
date = models.DateTimeField()
user = models.ForeignKey(User)
我真的不知道从哪里开始在父表中查找适当的信息并将其分配给变量。我需要做的是按照userstory表的“main”键进入story表,并将story表作为变量分配。但我就是看不出如何在定义中实现这一点
编辑:我尝试了story=userstory.objects.get(user=user),但我得到了“userstory匹配查询不存在”。通过阅读您之前链接到的问题,我发现了困惑所在。我的印象是一个
故事
可能有许多用户故事
与之相关。请注意,我使用大写字母
作为类名,这是Python的常见做法。我之所以做出这种假设,是因为您的模型结构允许在UserStory
模型中使用外键。您的模型结构应如下所示:
class Story(models.Model):
title = models.CharField(max_length=400)
thetext = models.TextField()
class UserStory(models.Model):
story = models.OneToOneField(Story) # renamed field to story as convention suggests
date = models.DateTimeField()
user = models.ForeignKey(User)
class ClassicStory(models.Model)
story = models.OneToOneField(Story)
date = models.DateTimeField()
author = models.CharField(max_length=200)
请参阅的用法。OneToOne字段表示1对1关系,这意味着一个故事只有一个用户故事。这也意味着一个用户故事只与一个故事相关。这就是“父子”关系,还有一个额外的约束,即父对象只有一个子对象。您以前使用ForeignKey意味着一个故事有多个与之关联的UserStories,这对于您的用例来说是错误的
现在,查询(和属性访问器)的行为将与您预期的一样
# get all of the users UserStories:
user = request.user
stories = UserStory.objects.filter(user=user).select_related('story')
# print all of the stories:
for s in stories:
print s.story.title
print s.story.thetext
请注意,这将创建一个SQL联接,因此每次打印故事文本时,您不会执行另一个查询。请仔细阅读,这是非常重要的
您前面的问题提到您有另一个表ClassicStories。它还应该有一个OneToOneField,就像UserStories一样。以这种方式使用OneToOne字段会使迭代故事模型变得非常困难,因为它可能是一个“ClassicStore”,但可能是一个“UserStory”:
看到问题了吗?你不知道这是什么样的故事。在访问子表中的字段之前,需要检查故事的类型。有一些项目可以帮助管理这种继承,例如,但这有点进步。如果您永远不需要迭代
故事
模型并访问它的子表,那么您不必担心。只要您只访问ClassicStories或UserStories中的故事,您就会没事。阅读您之前链接的问题,我发现了困惑所在。我的印象是一个故事
可能有许多用户故事
与之相关。请注意,我使用大写字母
作为类名,这是Python的常见做法。我之所以做出这种假设,是因为您的模型结构允许在UserStory
模型中使用外键。您的模型结构应如下所示:
class Story(models.Model):
title = models.CharField(max_length=400)
thetext = models.TextField()
class UserStory(models.Model):
story = models.OneToOneField(Story) # renamed field to story as convention suggests
date = models.DateTimeField()
user = models.ForeignKey(User)
class ClassicStory(models.Model)
story = models.OneToOneField(Story)
date = models.DateTimeField()
author = models.CharField(max_length=200)
请参阅的用法。OneToOne字段表示1对1关系,这意味着一个故事只有一个用户故事。这也意味着一个用户故事只与一个故事相关。这就是“父子”关系,还有一个额外的约束,即父对象只有一个子对象。您以前使用ForeignKey意味着一个故事有多个与之关联的UserStories,这对于您的用例来说是错误的
现在,查询(和属性访问器)的行为将与您预期的一样
# get all of the users UserStories:
user = request.user
stories = UserStory.objects.filter(user=user).select_related('story')
# print all of the stories:
for s in stories:
print s.story.title
print s.story.thetext
请注意,这将创建一个SQL联接,因此每次打印故事文本时,您不会执行另一个查询。请仔细阅读,这是非常重要的
您前面的问题提到您有另一个表ClassicStories。它还应该有一个OneToOneField,就像UserStories一样。以这种方式使用OneToOne字段会使迭代故事模型变得非常困难,因为它可能是一个“ClassicStore”,但可能是一个“UserStory”:
看到问题了吗?你不知道这是什么样的故事。在访问子表中的字段之前,需要检查故事的类型。有一些项目可以帮助管理这种继承,例如,但这有点进步。如果您永远不需要迭代
故事
模型并访问它的子表,那么您不必担心。只要您只访问ClassicStories或UserStories中的故事,您就没事了。嗨,Josh,我已经尝试将其用于for循环,并且在赋值之前我得到了一个引用的局部变量
错误,当我尝试在for循环之后使用main_Story或us.main时,我猜这意味着它什么也没做。@Tennant这是因为main\u story
变量只在循环范围内是局部变量。它不存在于循环之外。可能有许多主要故事,因此在循环之外只有一个main_故事是没有意义的。查看我的更新/编辑。谢谢Josh。最后,我需要帮助解决由此产生的第22条军规的情况。在故事显示页面上,我从url获取用户名和故事名称。但是用户名和故事名现在在不同的表中。看起来是这样的:try:user=user.objects.get(username=username)story=userstory.objects.get(title=story,user=user,)