Модель Django — «Многие ко многим», не возвращающая ничего

#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 /…