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().

Я не уверен, что делаю неправильно. Спасибо всем, кто может мне помочь.

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