Как исключить удаленные объекты в функции clean() на модели/форме с помощью inline_formsety

У меня есть модель с пользовательской функцией очистки, чтобы убедиться, что два DateRange не пересекаются:

class MyModel(models.Model):
    date_range = DateRangeField()

    def clean(self):
        error_dict = {}

        if MyModel.objects.exclude(id=self.id).filter(
            date_range__overlap=self.date_range):

            error_dict['date_range'] = ValidationError(
            'Range can not overlap with an existing period.',
            code='overlap_period')

        if error_dict:
             raise ValidationError(error_dict)

Это работает, но если я использую inline_formset для отправки нескольких записей одновременно и удаляю запись, которая устраняет конфликт (одновременно обновляя другие), ValidationError все равно возникает

Это происходит потому, что функция filter выполняется для существующих записей, а не для новых обновленных.

Как изменить filter, чтобы исключить удаленные объекты в inline_formset? Должен ли я вместо этого выполнить очистку формы? Если да, то как мне ссылаться на удаленные объекты?

Вам нужно создать логику поверх deleted_objects, которые вы получаете из набора форм. По этой причине проще реализовать эту логику в наборе форм, поскольку в методе clean() модели у вас есть видимость единственного текущего экземпляра (а не полного набора новых предстоящих экземпляров).

В Django doc объясняется, как работать с deleted_objects

instances = formset.save(commit=False)
for obj in formset.deleted_objects:
    # ... your logic here

Как видно из примера, вы можете перехватывать удаленные объекты, чтобы создать желаемую логику валидации.

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