从数据库层次结构的Django中的父表获取数据

2024-06-28 20:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

按照this的答案,我试图将我的SQL故事表拆分为父/子级-子级包含特定的用户数据,父级则是更通用的数据。现在我遇到了一个问题,这暴露了我在Django方面缺乏经验。我的用户页面试图显示用户编写的所有故事的列表。以前,当我的用户页面只从故事表中提取数据时,它工作得很好。现在我需要从两个有链接信息的表中提取数据,但我不知道该怎么做。在

这是我在尝试从父故事表中提取数据之前的用户页面视图:

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)

这是我的模型.py公司名称:

^{pr2}$

我真的不知道从哪里开始在父表中查找适当的信息并将其赋给变量。我需要做的是跟随userstory表的“main”键进入story表,并将story表指定为一个变量。但我不知道如何在定义中实现它。在

编辑:我试过故事=用户故事.objects.get(user=user)但我得到“userstory匹配查询不存在。”


Tags: 数据用户信息getrequestpageusername页面
1条回答
网友
1楼 · 发布于 2024-06-28 20:21:09

通读你之前提到的问题,我发现了困惑所在。我的印象是一个Story可能有很多UserStory与之相关。注意,我使用Capital作为类名,这是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 relationships here的用法。OneToOne字段表示1对1的关系,这意味着一个故事只有一个UserStory。这也意味着一个用户故事只与一个故事相关。这就是“父子”关系,还有一个额外的约束,即父对象只有一个子对象。之前使用ForeignKey意味着一个故事有多个关联的UserStories,这对于您的用例来说是错误的。在

现在,您的查询(和属性访问器)的行为将与您预期的一样。在

^{pr2}$

请注意,select_related将创建一个SQL联接,因此您不会在每次打印出故事文本时执行另一个查询。读了这篇文章,这是非常非常重要的!在

你前面的问题提到你还有另一张桌子,ClassicStories。它也应该有一个单独的字段,就像用户故事一样。以这种方式使用OneToOne字段使得在故事模型上迭代非常困难,因为它可能是一个“ClassicStory”,但它可能是一个“UserStory”:

# iterate over ALL stories

allstories = Story.objects.all()
for s in allstories:
    print s.title
    print s.thetext
    print s.userstory     # this might error!
    print s.classicstory  # this might error!

看到问题了吗?你不知道这是什么样的故事。在访问子表中的字段之前,您需要检查故事的类型。有一些项目可以帮助管理这种继承,例如django-model-utils InheritanceManager,但这有点进步。如果您不需要迭代Story模型并访问它的子表,那么您不必担心。只要您只访问ClassicStories或UserStories中的Story,就可以了。在

相关问题 更多 >