Django: использование user.get_profile () - PullRequest
2 голосов
/ 12 апреля 2011

У меня очень новый вопрос по использованию аутентификации 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() или что-то еще?Или я должен ссылаться UserProfile вместо User в моей Post модели?

1 Ответ

11 голосов
/ 12 апреля 2011

Вы должны иметь возможность использовать OneToOneField(User, related_name='profile') в своей модели UserProfile, а затем выполнить Post.objects.select_related('author__profile').

...