我有一个关于使用django auth的新手问题。这是我的模特:
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()
或其他什么吗?或者我应该在我的UserProfile
模型中引用User
而不是Post
?
答案 0 :(得分:11)
您应该可以在UserProfile模型中使用OneToOneField(User, related_name='profile')
,然后执行Post.objects.select_related('author__profile')
。