Django создает дополнительную нежелательную запись в промежуточной таблице «много-2-много».

#python #django #sqlite #django-models

Вопрос:

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

Вот модели:

 class Passenger(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()


class Flight(models.Model):
    time = models.DateTimeField('flight time')
    destination = models.CharField(max_length=20)
    passengers = models.ManyToManyField(
        to=Passenger,
        symmetrical=True,
        related_name='flights',
        blank=True,
    )

 

Допустим, промежуточная таблица выглядит так, с пассажиром
Скриншот промежуточной базы данных

Скажем flight_object , это рейс с идентификатором=1 и passenger_object Пассажир с идентификатором=2, когда я запускаю flight_object.passengers.add(passenger_object) Django, добавляет 2 записи в промежуточную таблицу в базе данных. Теперь таблица выглядит так: Скриншот промежуточной таблицы

Обе записи с ID=1 и 2 должны быть там, но 3 неверно, и flight_id внешний ключ предназначен для совершенно другого рейса!

Ответ №1:

Это из-за symmetrical=True . Вы не должны создавать симметричное ManyToMany отношение к какой-либо другой модели, кроме self .

Согласно документам, при использовании symmetrical=True Django пытается вставить симметричную запись в through таблицу.