【问题标题】:How do I add a default value to a nested serializer?如何向嵌套序列化程序添加默认值?
【发布时间】:2020-12-07 20:13:24
【问题描述】:

我试图让我的“地址”API 返回默认值(空字符串“”),但是当我在序列化程序字段中使用 default="" 时,它会返回 null。 这是我的主要序列化器(LocationSerializer)


class LocationSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(read_only=True)
    business_id = serializers.PKRelatedField(Business.any.all(), "business")
    city_id = serializers.UUIDField(required=True)
    name = serializers.CharField(max_length=48, required=True)
    tax_number = serializers.CharField(max_length=48)
    phone = serializers.PhoneNumberField()
    address = serializers.CharField()
    address_details = AddressEmbeddedSerializer(default="", source="addresses")
    footer = serializers.CharField()
    is_active = serializers.BooleanField(required=True)
    has_kds = serializers.BooleanField(read_only=True)
    position = serializers.PointField()
    image = serializers.ImageField()
    # profile = LocationProfileSerializer()
    permissions = PermissionSerializer(many=True, read_only=True)
    payment_methods = PaymentMethodEmbeddedSerializer(many=True, read_only=True)

    class Meta:
        model = Location
        fields = (
            "id", "business_id", "city_id", "name", "tax_number", "phone", "address", "address_details", "footer",
            "is_active", "has_kds", "position", "image", "permissions", "payment_methods"
        )

这是我的嵌套序列化器(AddressEmbeddedSerializer)



class AddressEmbeddedSerializer(serializers.ModelSerializer):
    city = serializers.CharField(default="")
    area = serializers.CharField(default="")
    block = serializers.CharField(default="")
    avenue = serializers.CharField(default="")
    long = serializers.CharField(default="")
    lat = serializers.CharField(default="")

    class Meta:
        model = LocationAddress
        fields = (
            "city", "area", "block", "avenue", "long", "lat"
        )

我期望的值是:

"address_details": {
            "city": "",
            "area": "",
            "block": "",
            "avenue": "",
            "long": "",
            "lat": ""
        }

我得到的是:

"address_details": null

请注意所有的 CRUD 操作都在工作,这只是一个默认值问题

【问题讨论】:

  • 可以实现渲染器以在 GET 请求中显示空值。我在csv renderer 中想要同样的东西,通过提供explicit headers 来实现它

标签: django django-models django-rest-framework backend django-serializer


【解决方案1】:

"address_details": null 的原因是当前对象在模型对象上没有相关的addresses,因此不会访问嵌套的序列化程序,因此不会生成您想要的 JSON 输出。

另外,default 在没有为 POST 请求而不是 GET 的字段提供值时使用

我建议你处理address_details,当它是null,但如果你真的需要这样做,你可以在to_representation()to_internal_value()做一些事情,看看这个答案:https://stackoverflow.com/a/38606711/4984493

另外,您可以使用SerializerMethodField,因此基于obj.addresses 的值,如果它是null,您将返回所需的JSON 输出。

【讨论】:

  • 谢谢!请问,“当address_details为null时处理是什么意思?
  • address_details 为空时,您返回空字符串的默认值
猜你喜欢
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2016-10-04
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多