Django's ModelMultipleChoiceField не удается добавить идентификаторы ключей форинга
Я пытаюсь сохранить модель из админки Django с помощью форм:
Вот models.py
:
class Availability(models.Model):
"""Model for the availability table."""
availability_id = models.AutoField(primary_key=True)
schedule = models.ForeignKey(
AdventureSchedule,
on_delete=models.CASCADE
)
available_guests = models.PositiveIntegerField(null=True, blank=True)
date = models.DateField(auto_now=False, auto_now_add=False)
price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
discount = models.DecimalField(max_digits=6, decimal_places=2)
status = models.CharField(max_length=50, default='Available')
created = models.DateTimeField(auto_now_add=True)
last_updated = models.DateTimeField(auto_now=True)
class Meta:
"""Availability model Meta."""
verbose_name_plural = "2.3 - Availability"
def __str__(self):
return self.date.strftime("%B %d, %Y")
class Reservations(models.Model):
"""Model for the reservations table."""
reservation_id = models.AutoField(primary_key=True)
availability = models.ManyToManyField(Availability)
user = models.ForeignKey(BaseUser, on_delete=models.PROTECT)
num_guests = models.IntegerField()
num_military = models.IntegerField()
num_youth = models.IntegerField()
price = models.FloatField()
status = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
last_updated = models.DateTimeField(auto_now=True)
class Meta:
"""Reservations model Meta."""
verbose_name_plural = "Reservations"
forms.py
:
class ReservationsAdminForm(forms.ModelForm):
"""ModelForm for the reservations model."""
class Meta:
model = Reservations
exclude = []
availability = forms.ModelMultipleChoiceField(
queryset=Availability.objects.all(),
required=False,
widget=FilteredSelectMultiple('availability', False)
)
def __init__(self, *args, **kwargs):
# Do the normal form initialisation.
super(ReservationsAdminForm, self).__init__(*args, **kwargs)
# If it is an existing reservation (saved objects have a pk).
if self.instance.pk:
# Populate the availability field with the current reservation.
self.fields['availability'].initial = self.instance.availability_set.all()
def save_m2m(self):
# Add the availability to the reservation.
self.instance.availability_set.set(self.cleaned_data['available_dates_select'])
def save(self, *args, **kwargs):
# Default save.
instance = super(ReservationsAdminForm, self).save()
# Save many-to-many data.
self.save_m2m()
return instance
И admin.py
:
class ReservationsAdmin(admin.ModelAdmin):
# Use our custom form.
form = ReservationsAdminForm
Итак, форма выполняет свою работу и отображает список на странице администратора, я могу выбрать Availability
даты из списка и заполнить остальные поля. Но в момент сохранения происходит сбой, потому что не добавляются внешние ключи выбранных Availability
дат. Вот ошибка:
django.db.utils.IntegrityError: NOT NULL constraint failed: adventures_reservations.availability_id
Пытаясь отладить код в функции save
из ReservationsAdminForm
, кажется, что cleaned_data
происходит так, как ожидалось:
{'availability': <QuerySet [<Availability: December 24, 2022>, <Availability: December 23, 2022>]>, 'user': <BaseUser: user@email.com>, 'num_guests': 5, 'num_military': 1, 'num_youth': 1, 'price': 1.0, 'status': 'Reserved'}
После этой точки он терпит неудачу на super(ReservationsAdminForm, self).save()
.
Я не уверен, что делаю неправильно. Спасибо всем, кто может мне помочь.