Как исключить удаленные объекты в функции 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
Как видно из примера, вы можете перехватывать удаленные объекты, чтобы создать желаемую логику валидации.