【问题标题】:Django rest "this field is requiered" on a many to many field when blank=True当空白 = True 时,Django 在多对多字段上休息“此字段是必需的”
【发布时间】:2019-07-06 12:19:40
【问题描述】:

我想通过 django-rest-api UI 制作一个对象。 这个对象有一个多对多字段,上面保存着其他对象。

即使该字段为空白,参数设置为 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 字段。

我期望如果数据库中不需要该字段,那么序列化程序可以在创建时将其设置为 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')

【问题讨论】:

  • 你能显示ProfileSerializer吗?
  • 在编辑中添加..
  • 尝试在black_listed = ProfileSerializer(many=True, required=False, allow_null=True)上添加required=Falseallow_null=True
  • 太棒了!你可以把它放在一个答案中让其他人能够看到 - 我会除了它

标签: django django-rest-framework


【解决方案1】:

您应该在您的序列化程序声明中提供required=False 参数:

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

如果您希望能够为该字段发布空值,您还可以添加allow_null=True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2020-10-10
    • 2016-04-29
    • 2020-07-25
    • 1970-01-01
    • 2011-04-02
    • 2019-09-27
    相关资源
    最近更新 更多