Мое простейшее предложение, и я считаю, что оно лучшее на практике, состоит в том, что вы создаете ClothingTop
ModelForm
и устанавливаете метод buttons_clean()
в форме, которая будет выполнять таможенная проверка. Эта форма также должна быть установлена для ClothingTop
ModelAdmin
.
Единственный другой способ сделать это - создать настраиваемое поле модели для поля buttons
(здесь валидаторы работать не будут, поскольку они получают только значение поля кнопок и не обращают внимания на тип, другие поля модели). Самый простой способ сделать это будет:
ButtonsField(models.PositiveSmallIntegerField):
def validate(self, value, model_instance):
# here we get the buttons field value and can get the type value
# exactly what we need!
type = getattr(model_instance, 'type')
if type == SHIRT and not value:
raise ValidationError('Type set to shirt, but buttons value is empty')
super(self, ButtonsField).validate(value, model_instance)
Я упомянул подход с настраиваемыми полями для полноты, я думаю, что вам следует пропустить создание настраиваемого типа поля , если он не является полностью универсальным и легко повторно используется в любой модели. , Для этих особых случаев просто используйте проверку формы. Ваши модели должны обеспечивать только целостность базы данных, которую вы уже охватили ClothingTop
, бизнес-правила выходят из проверки формы.