Django отдыхает «это поле обязательно для заполнения» на поле «многие ко многим», когда пусто = True - PullRequest
0 голосов
/ 06 июля 2019

У меня есть объект, который я хотел бы создать через пользовательский интерфейс django-rest-api. Этот объект имеет множество полей, которые содержат другие объекты.

Даже если это поле пустое, для параметра установлено значение True, я получаю ответ, что «это поле обязательно для заполнения».

class Post(models.Model):
    title = models.CharField(max_length=100)
    slug = models.CharField(max_length=200, null=True)
    description = models.CharField(max_length=200, null=True)
    content = HTMLField('Content', null=True)
    black_listed = models.ManyToManyField('profile_app.Profile', related_name='black_listed_posts', blank=True)
    score = models.PositiveIntegerField(null=True, default=0, validators=[MaxValueValidator(100)])

serializers.py:

class PostSerializer(serializers.HyperlinkedModelSerializer):
    black_listed = ProfileSerializer(many=True)
    read_only = ('id',)

    def create(self, validated_data):
        self.black_listed = []

    class Meta:
        model = Post
        fields = ('id', 'title', 'slug', 'description',
                  'content',
                  'black_listed', 'score')

views.py:

class PostViewSet(ModelViewSet):
    serializer_class = PostSerializer
    queryset = Post.objects.all()
    lookup_field = "slug"

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.black_listed = []
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Как вы можете видеть, я попытался переопределить метод create() как на сериализаторе, так и на наборе представлений, но это не сработало и все же дало мне обязательное заполнение поля black_list.

enter image description here

То, что я ожидал, что если поле не требуется в БД, то сериализатор может установить его на None при создании

что мне здесь не хватает?

РЕДАКТИРОВАТЬ:

ProfileSerializer:

class ProfileSerializer(serializers.ModelSerializer):
    interests = InterestSerializer(read_only=True, many=True)

    class Meta:
        model = Profile
        fields = ('slug', 'user_id', 'image', 'role', 'work_at', 'interests')

1 Ответ

1 голос
/ 06 июля 2019

Вы должны указать аргумент required=False в объявлении сериализатора:

class PostSerializer(...):
    black_listed = ProfileSerializer(many=True, required=False)
    # __________________________________________^

Если вы хотите иметь возможность отправить нулевые значения для этого поля, вы также можете добавить allow_null=True.

...