2014-09-16 2 views
0

Я новичок в изучении Django, и я работаю на странице, которая отображает только профиль пользователя и отзывы, написанные для этого пользователя (оба в разных моделях).Как связать две разные модели в Django

Часть, о которой я немного не уверен, заключается в том, как связать разные таблицы или модели. То, что я пытаюсь сделать, чрезвычайно элементарно. Довольно сильно, как только вы нажмете на имя пользователя, он перейдет на страницу профиля, в которой также отображаются все отзывы пользователей внизу. Мне интересно, могу ли я использовать переменную вместо «name = ben» и изменить ее на нечто вроде «name = user_you_clicked_on».

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

from django.shortcuts import render 

def index(request): 
    profile_info = User.objects.filter(name=‘ben’) 
    context = {‘profile_info’: profile_info}  
    latest_reviews = UserReview.objects.filter(name=‘ben').order_by('-pub_date')[:5] 
    context = {‘profile_info’: profile_info, 'latest_reviews': latest_reviews} 
    return render(request, 'randomtemplate.html', context) 
+0

Прошли ли вы с помощью учебника Django? Такая связь между моделями - это то, что она довольно хорошо охватывает. Как правило, вы действительно используете внешний ключ, а не имя, и извлекаете его из URL-адреса. Похоже, что вы сохраняете имя пользователя как поле на модели UserReview', это плохая идея, нарушая стандартные правила нормализации базы данных, а также делая это более сложным. –

+0

Что вы, вероятно, захотите сделать, это добавить отношение внешнего ключа, которое связывает любое количество строк UserReview с пользовательской строкой. См. Объяснение: https://docs.djangoproject.com/en/1.7/topics/db/examples/many_to_one/ – rje

+0

. Кстати, вам не нужно использовать внешний ключ для поиска отзывов пользователей, вы может использовать синтаксис, подобный этому: 'UserReview.objects.filter (user__name = 'ben')'. Предполагается, что вы установили отношение внешнего ключа, где класс модели UserReview имеет атрибут «пользователь», который ссылается на экземпляр пользователя. – rje

ответ

0

Вы можете pass username in the URL (ID будет лучше, но давайте не будем усложнять это):

urlpatterns = patterns('', 
    url(r'^user/(?P<username>\w+)/', 'index'), 
) 

Тогда ваш взгляд может выглядеть следующим образом:

def index(request, username): 
    profile_info = User.objects.filter(name=username) 
0

В случае, если вы все еще хотите «соединить» две таблицы. В models.py я хотел бы написать:

from django import models 

    class User(models.Modle): 
     name = models.CharField(max_length=30) 
     #add more fields here 

    class UserReview(models.Model): 
     user_id = models.ForeignKey(User) 
     #add more fields here 

Это создаст две таблицы в вашей БД (пользователей и UserReview), где Userreview связан с пользователем с помощью внешнего ключа (один пользователь (идентификатор) -> много отзывов (user_id1 , user_id1; user_id2 и т. д.)). По умолчанию этот внешний ключ является автоматически генерируемым полем идентификатора таблицы пользователя (по умолчанию поля id, которые также являются первичными ключами в этом примере, автоматически генерируются для каждой таблицы, если не указано иное).

Я надеюсь, что это поможет

Смежные вопросы