【发布时间】:2012-12-30 21:02:46
【问题描述】:
我已经设计了我的模型,使得所有模型在 auth_user 表(User)上都具有一对一的关系。为了您的快速参考,我将图片粘贴在下面
现在我想选择表 BasicDetails、Department 和 Project 中与用户名相关的所有数据。以下查询未获取结果。
User.objects.select_related().get(username='user1')
有人可以帮我解决这个问题吗?
-维克拉姆
【问题讨论】:
我已经设计了我的模型,使得所有模型在 auth_user 表(User)上都具有一对一的关系。为了您的快速参考,我将图片粘贴在下面
现在我想选择表 BasicDetails、Department 和 Project 中与用户名相关的所有数据。以下查询未获取结果。
User.objects.select_related().get(username='user1')
有人可以帮我解决这个问题吗?
-维克拉姆
【问题讨论】:
您应该使用 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')
现在您可以使用.projects 代替.project_set 来访问用户的项目:
u = User.objects.get(pk=1)
user_objects = u.projects.all()
【讨论】:
user_object吗?