У меня есть сериализатор, и я хочу проверить, выбран ли хотя бы один из многих полей. У меня есть два поля ManyToMany в объектах, которые являются уровнями и категориями.
Мой сериализатор:
class WorkflowSerializer(serializers.ModelSerializer):
class Meta:
model = Workflow
fields = ('id', 'name', 'description', 'levels', 'categories')
read_only_fields = ['id']
depth = 2
def validate_categories(self,categories):
if len(categories)==0:
raise serializers.ValidationError("You haven't selected any category,Please select alteast one")
def validate_levels(self, levels):
for level in levels:
if len(level['permissions'])==0:
raise serializers.ValidationError("You haven't specified a permission for the level")
return levels
Теперь валидация не работает должным образом. Данные сохраняются, даже если ни один из них не выбран в поле «Многие ко многим».






Это сработало:
def validate(self, data):
if len(self.initial_data['categories'])==0:
raise serializers.ValidationError("category not selected")
for level in self.initial_data['levels']:
if len(level['permissions'])==0:
raise serializers.ValidationError("No permission added for a level")
return data
Я бы переместил этот код в общий
validate()- сейчас не могу проверить, но, насколько я помню,validate_{field}вообще не вызывается, если поле пустой или Никто - в качестве альтернативы вы можете попробовать переопределить эти поля и установить для них значение not разрешить пустые/нулевые значения.