2016-01-29 4 views
1

У меня есть таблица профилей, у которой есть внешний ключ пользователя.Django query extended USER table

class Profile(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    image = models.CharField(max_length=100) 
    user = models.ForeignKey(User) 

У меня также есть таблица КОММЕНТАРИИ, у которой есть внешний ключ пользователя.

class Comment(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    content = models.TextField() 
    user = models.ForeignKey(User) 

Я хочу, чтобы запросить таблицу COMMENT, а также я хочу, чтобы получить изображение пользователя, который находится в таблице PROFILE. Как я могу запросить это наиболее эффективным способом в django ?.

благодаря

ответ

0

Если вы используете Django = < 1.4 следующие лучше практики:

comment = Comment.objects.get(pk=1) 
comment.user.get_profile().image 

После устаревания родной Profile моделью поддержки (Джанго 1.5+) все еще возможно:

comment = Comment.objects.get(pk=1) 
comment.user.profile.image 

Джанго 1.5+ представляют модели пользовательских AUTH, так что вы можете сделать следующее:

comment = Comment.objects.get(pk=1) 
comment.user.image 

В крайней мере, вы должны изменить ваш ForeignKey к OneToOne отношению к колонку пользователя на Profile как Джанго = < 1,4 ожидает только один User Profile для связи с User.

Ссылки:

Джанго 1,4 get_profile: https://docs.djangoproject.com/en/1.4/topics/auth/#django.contrib.auth.models.User.get_profile

Джанго 1.5+ простирающиеся модели пользователя: https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#extending-the-existing-user-model

+0

Nice .. Спасибо за эту информацию. Это очень полезно. Я просто изменил поле ForeignKey на OneToOne –

1

Если все в порядке с изменением ForeignKey в OneToOneField на модели профиля, то вы можете сделать это,

Comment.objects.all().select_related('user__profile') 

выше один выбор дополнительных данных, связанных с-объекта, когда он выполняет свой запрос. Это ускоритель производительности, который приводит к одному более сложному запросу, но означает, что позднее использование отношений внешнего ключа не потребует запросов к базе данных.

В противном случае вы можете получить его таким образом

for comment in Comment.objects.all(): 
    print comment.user.profile_set.all()[0].image 
+0

Я просто изменить ForeignKey на поле OneToOne и работает нормально .. Спасибо за ответ! , : D –