Django сериализатор проверка поля manytomany

У меня есть сериализатор, и я хочу проверить, выбран ли хотя бы один из многих полей. У меня есть два поля 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

Теперь валидация не работает должным образом. Данные сохраняются, даже если ни один из них не выбран в поле «Многие ко многим».

Я бы переместил этот код в общий validate() - сейчас не могу проверить, но, насколько я помню, validate_{field} вообще не вызывается, если поле пустой или Никто - в качестве альтернативы вы можете попробовать переопределить эти поля и установить для них значение not разрешить пустые/нулевые значения.

mfrackowiak 20.02.2019 10:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
511
1

Ответы 1

Это сработало:

  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

Другие вопросы по теме