Django: 使用user.get_profile()
我有一个关于使用 Django 认证的初学者问题。这里是我的模型:
class UserProfile(models.Model):
""" Main user profile used on a website """
user = models.ForeignKey(User, unique=True) # reference to built in django user
display_name = models.CharField(max_length=100, blank=True)
# and several more fields
class Post(models.Model):
""" Blog entry """
author = models.ForeignKey(User)
tags = models.ManyToManyField(Tag)
title = models.CharField(max_length=255)
text = models.TextField()
问题出现在我想输出一系列帖子的时候:
#view
posts = Post.objects.all()
#template
{% for post in posts %}
{{ post.title }} by {{ post.author.get_profile.display_name }}
{% endfor %}
对于 100 个帖子,这样的查询会产生 101 次数据库查询,因为每次调用 get_profile()
都会去数据库获取 display_name
字段。
有没有办法解决这个问题?我可以使用 select_related()
吗?或者我应该在我的 Post
模型中引用 UserProfile
而不是 User
吗?
1 个回答
11
你可以在你的用户资料模型中使用一个叫做 OneToOneField(User, related_name='profile')
的字段,这样就能把用户和用户资料关联起来。然后你可以用 Post.objects.select_related('author__profile')
这个命令来一次性获取帖子作者和他们的资料。