django - объект "QuerySet" не имеет атрибута "пользователь" - PullRequest
3 голосов
/ 25 октября 2011

У меня две модели Профиль и Аватар.

models.py

class Profile(models.Model):
    user = models.ForeignKey(User)
    profile_name = models.CharField(blank=True, max_length=50)

    def __unicode__(self):
       return u'%s %s' % (self.user, self.profile_name)  


class Avatar(models.Model):
    user = models.ForeignKey(User)
    paths = models.CharField(max_length=100)
    def __unicode__(self):
        return u'%s %s' % (self.user,self.paths)

Я хочу выполнить поиск в поле profile_name (из модели профиля) и получить пути к изображениям, хранящимся в поле paths (из модели аватара).

view.py

profile_name_search = Profile.objects.filter(profile_name=usr_name)
user_avatar = Avatar.objects.filter(user=profile_name_search.user.id)

usr_name переменная передается из поля формы.

Почему-то я получаю эту ошибку:

'QuerySet' object has no attribute 'user'
user_avatar = Avatar.objects.filter(user=profile_name_search.user.id)

Любые иды?

Ответы [ 2 ]

15 голосов
/ 25 октября 2011

filter() возвращает QuerySet также, если только один объект найден.Если вы хотите вернуть только экземпляр модели, используйте get():

profile_name_search = Profile.objects.get(profile_name=usr_name)
user_avatar = Avatar.objects.filter(user=profile_name_search.user.pk)
1 голос
/ 25 октября 2011

Помните, что «фильтр» возвращает запрос, а не модель. Должен ли поиск по имени профиля возвращать несколько пользователей? Если это так, я думаю, вы хотите:

users = User.objects.filter( profile_set__profile_name = usr_name )
user_avatar = Avatar.objects.filter( user__in = users )

В противном случае вы можете захотеть:

profile = Profile.objects.get( profile_name = usr_name )
avatars = profile.avatar_set.all()

Если у пользователя есть только один аватар, вы можете использовать OneToOneField от Аватара до профиля, а затем просто получить доступ как profile.avatar.

...