我使用的是两个模型,一个是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
对象?我可以只用一个吗?
答案 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