Как создать объект для модели Django с полями "многие ко многим"?

class Date(models.Model):
    date = models.DateField()
    
    def __str__(self):
        return str(self.date)

class Time(models.Model):
    time = models.TimeField()

    def __str__(self):
        return str(self.time)
    

class Showtimes(models.Model):
    theater = models.ForeignKey(Theater,on_delete=models.CASCADE,related_name="theater")
    movie = models.ForeignKey(Movie,on_delete=models.CASCADE,related_name="movie")
    show_date = models.ManyToManyField(Date)
    show_time = models.ManyToManyField(Time)

как создать объект с несколькими датами и временем, передавая aruguments в вызове функции objects.create

Showtimes.objects.create(theater=th,movie=m,show_date = Date.objects.all(),show_time = Time.objects.all()).save()

я хочу создать объект для ShowTimes с помощью функции вызов objects.create, передав все поля даты и времени

К сожалению, вы не можете напрямую использовать objects.create() для установки отношений ManyToManyField, поскольку эта функция сначала создает объект, а затем ожидает, что отношения "многие-ко-многим" будут добавлены отдельно.

В Django отношения ManyToManyField требуют, чтобы вы сначала создали объект без полей ManyToMany, а затем добавили связанные объекты с помощью метода .set() или .add().

Вот пример кода.

showtimes = Showtimes.objects.create(theater=th, movie=m)

showtimes.show_date.set(Date.objects.all())  # or pass specific Date objects
showtimes.show_time.set(Time.objects.all())  # or pass specific Time objects

Надеюсь, это немного поможет вам.

Я хочу создать объект для ShowTimes путем вызова функции objects.create, передав все поля даты и времени.

Это не то, как работает .create(…) [Django-doc]. Для того чтобы заполнить ManyToManyField, сначала нужно иметь первичный ключ, а значит, создать Showtimes объект.

Вы можете сначала создать элемент, а затем заполнить поля:

showtime = Showtimes.objects.create(theater=th, movie=m)
showtime.show_date.set(*Date.objects.all())
showtime.show_time.set(*Time.objects.all())

Строго говоря, можно было бы позволить .create(..) заполнять эти поля, но в этом нет особого смысла, поскольку операция потребует нескольких запросов, и если один из них не выполнится, база данных будет находиться в неполном состоянии между "не создана" и "создана", а также это значительно усложнит метод .create(…).


Примечание: Поскольку ManyToManyField относится к коллекции элементов, ManyToManyField обычно получают множественное имя. Таким образом, вы можете захотеть рассмотреть возможность переименования show_date в show_dates.

Вернуться на верх