#python #django #django-models #many-to-many
#python #django #django-модели #многие ко многим
Вопрос:
Давний слушатель, впервые публикующий. Надеюсь получить некоторую помощь в решении моей проблемы с моделями.
У меня возникли проблемы с моими отношениями «многие ко многим». Когда я отправляю форму, я хочу, чтобы информация о моем пользователе была связана с публикацией, которую они создают. Я использую «многие ко многим», потому что у меня будет дополнительная функция, к которой другие пользователи смогут присоединиться в той же поездке.
В настоящее время мои данные для моих таблиц поездок создаются нормально, но мой пользователь не связан с идентификатором поездки, поэтому я не могу отобразить их имя в шаблоне.
Ниже приведен мой код. Ценю любую помощь! Приветствия
Вот мои models.py:
class User(models.Model):
name = models.CharField(max_length=45)
username = models.CharField(max_length=255)
password = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = UserManager()
class Trip(models.Model):
destination = models.CharField(max_length=45)
description = models.CharField(max_length=255)
datefrom = models.CharField(max_length=255)
dateend = models.CharField(max_length=255)
user = models.ManyToManyField(User)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Вот мой views.py:
def travels(request):
user = User.objects.get(id=request.session['logged_user'])
all_trips = Trip.objects.all().order_by('-id')
user_trips = Trip.objects.filter(user=request.session['logged_user'])
context = {
"user_trips": user_trips,
"all_trips": all_trips,
"user": user,
}
return render(request, 'belt_exam/travels.html', context)
def addtrip(request):
user_id = request.session['logged_user']
createdtrip = Trip.objects.create(destination=request.POST['destination'], description=request.POST['description'], datefrom=request.POST['datefrom'], dateend=request.POST['dateend'])
createdtrip.user.add(User.objects.get(id=user_id))
return redirect('/travels')
Вот мой шаблон:
{% for alltrip in all_trips.all %}
<tr>
<td>{{alltrip.name}}</td>
<td><a href="travels/destination/{{alltrip.id}}">{{alltrip.destination}}</a></td>
<td>{{alltrip.datefrom}}</td>
<td>{{alltrip.dateend}}</td>
<td>
<form class="" action="travels/destination/{{alltrip.id}}" method="POST">
{% csrf_token %}
<input type="submit" value="Join">
</form>
</td>
</tr>
{% endfor %}
Ответ №1:
В строке
user_trips = Trip.objects.filter(user=request.session['logged_user'])
вы сравниваете идентификатор пользователя из сеанса с User
объектом. Это не сработает. Правильным было бы
user_trips = Trip.objects.filter(user=user)
Но есть лучший способ заставить пользователя отключиться. Для каждого отношения Django создает обратное отношение. Имя может быть задано как related
атрибут name для ManyToManyField
user = models.ManyToManyField(User, related_name='trips')
Теперь вы можете просто использовать этот атрибут в целевой модели в качестве менеджера объектов (например objects
)
user_trips = user.trips.all()
Комментарии:
1. Спасибо, Клаус! Я все еще немного запутался в том, как это работает. Мои «модели. ManyToManyField(User)» находится в таблице Trip. Я пытаюсь связать две таблицы вместе, чтобы я мог добавить идентификатор пользователя плаката к идентификатору поездки. Можете ли вы помочь объяснить подробнее? Извините, я новичок в программировании, поэтому спасибо за ваше терпение!
2. возможно, это поможет вам понять docs.djangoproject.com/en/1.10/topics/db/queries /…