首页 > 解决方案 > Django rest 框架序列化程序忽略 extra_kwargs 或自定义属性

问题描述

我正在尝试为客户端和主要用户制作一个略有不同的 api。所以如果角色是客户端,我想稍后添加客户端。

class StoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Store
        fields = ["id", "name", "location", "location_lat", "location_lng", "client"]

    def create(self, validated_data):
        user = self.context["request"].user
        if user.role == Roles.CLIENT.name:
            validated_data["client"] = user.client

笨拙的模型看起来像这样

class Store(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)

当我现在使用具有角色客户端的用户调用序列化程序时,我得到以下响应:

{"client":["This field is required."]}

哪个是对的。extra_kwargs但是当我添加到 StoreSerializer时发生了奇怪的事情。如果我将序列化程序更改为:

class StoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Store
        fields = ["id", "name", "location", "location_lat", "location_lng", "client"]
        extra_kwargs = {
            "client": { "required": False }
        }

    def create(self, validated_data):
        user = self.context["request"].user
        if user.role == Roles.CLIENT.name:
            validated_data["client"] = user.client

或将其更改为

class StoreSerializer(serializers.ModelSerializer):
    client = serializers.UUIDField(required=False)

    class Meta:
        model = models.Store
        fields = ["id", "name", "location", "location_lat", "location_lng", "client"]

    def create(self, validated_data):
        user = self.context["request"].user
        if user.role == Roles.CLIENT.name:
            validated_data["client"] = user.client

我得到同样的回应。怎么会这样?客户端不应该是必需的吧?

版本:

标签: djangodjango-rest-frameworkdjango-serializer

解决方案


商店模型应该是这样的:(注blank

class Store(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, blank=True)

现在在数据库级别上,您允许客户端在 Store 模型中为空。

这样的序列化器:

class StoreSerializer(serializers.ModelSerializer):
    client = serializers.PrimaryKeyRelatedField(queryset=models.Client.objects.all(), required=False)

    class Meta:
        model = models.Store
        fields = ["id", "name", "client"]
    ...

您的序列化程序现在应该可以工作了。


推荐阅读