0

我已经设计了我的模型,使得所有模型都将在 auth_user 表上具有一对一的关系,即User. 为了您的快速参考,我粘贴了下面的图片

在此处输入图像描述

现在我想选择表 BasicDetails、Department 和 Project 中与用户名相关的所有数据。以下查询未获取结果。

User.objects.select_related().get(username='user1')

有人可以帮我吗?

-维克拉姆

4

1 回答 1

1

您应该使用 prefetch_related 来提高效率,因为您的关系是反向的(您想从 User 访问其他记录,而不是相反):

u = User.objects.prefetch_related('project_set', 'department_set', 'basicdetails_set').get(username='user1')

这不会生成单个查询,但 Django 将使用缓存技术来有效地产生更少的数据库开销。如果我没记错的话,它将产生 4 个查询(4 个表中的单个连接可能会更慢,具体取决于记录、索引等的数量)。好处是在后续请求中不会生成查询。例如获取用户的项目:

u.project_set.all() #hits the db
u.project_set.all() #cached version, no db hit

有关更多信息,请参见此处https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-one-relationships

编辑:什么是project_set

如果您的项目模型是这样定义的

class Project(models.Model):
    ...
    user = models.ForeignKey(User)

那么您可以Project.objects.get(pk=1).user访问与项目实例关联的用户,但是您将如何做相反的事情(获取某个用户的所有项目)?为方便起见,Django 会自动将 '_set' 属性包含到另一个模型中。因此我们可以这样获取某个用户的项目:

u = User.objects.get(pk=1)
user_objects = u.project_set.all()

但是,如果您想为这种反向关系显式设置名称,django 允许您使用related_name如下关键字参数定义 ForeignKey:

class Project(models.Model):
    ...
    user = models.ForeignKey(User, related_name='projects')

现在,.project_set您可以使用它.projects来访问用户的项目:

u = User.objects.get(pk=1)
user_objects = u.projects.all()
于 2012-12-28T16:05:47.143 回答