django模型:通过OneToOne关系检索对象的更有效方法

时间:2014-11-10 12:14:15

标签: django-models one-to-one

我使用的是两个模型,一个是User(来自django.contrib.auth.models),另一个是Privilege:

class Privilege(models.Model):
    user = models.OneToOneField(User)
    ...

我可以检索用户的privilege

user = User.objects.get(username=request.user)
if user:
    privilege = Privilege.objects.get(user=user)

我的问题:是否总是需要两个数据库操作来获取privilege对象?我可以只用一个吗?

1 个答案:

答案 0 :(得分:2)

首先,您不必手动执行第二个查询,只需遍历关系:

try:
    privilege = User.objects.get(username=request.user).privilege
except User.DoesNotExist # Use this with get()
    pass

但它会在后台进行第二次查询。

因此,您可以使用select_related使反向遍历更有效(即1个查询)

  

select_related :返回一个QuerySet,它将“跟随”外键关系,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致单个更复杂的查询,但意味着以后使用外键关系不需要数据库查询。

privilege = User.objects.select_related("privilege").get(username=request.user).privilege