Как создать объект для модели 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
.