如何向嵌套序列化程序添加默认值?
How do I add a default value to a nested serializer?
我试图让我的“地址”API return 成为默认值(空字符串“”),但是当我在序列化程序字段中使用 default="" 时,它 return 改为 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 操作都有效,这只是一个默认值问题
"address_details": null
的原因是当前对象在模型对象中没有相关的 addresses
,因此不会访问嵌套的序列化程序,因此您想要的 JSON 输出获胜' 生成。
另外,default
在没有为 POST
请求的字段提供值而不是 GET
时使用
我建议你在 null
时处理 address_details
,但如果你真的需要这样做,你可以在 to_representation()
或 to_internal_value()
处做一些事情,请参阅这个答案:
此外,您可以使用 SerializerMethodField
,因此根据 obj.addresses
的值,如果它是 null
或者不是您 return 所需的 JSON你需要的输出。
我试图让我的“地址”API return 成为默认值(空字符串“”),但是当我在序列化程序字段中使用 default="" 时,它 return 改为 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 操作都有效,这只是一个默认值问题
"address_details": null
的原因是当前对象在模型对象中没有相关的 addresses
,因此不会访问嵌套的序列化程序,因此您想要的 JSON 输出获胜' 生成。
另外,default
在没有为 POST
请求的字段提供值而不是 GET
我建议你在 null
时处理 address_details
,但如果你真的需要这样做,你可以在 to_representation()
或 to_internal_value()
处做一些事情,请参阅这个答案:
此外,您可以使用 SerializerMethodField
,因此根据 obj.addresses
的值,如果它是 null
或者不是您 return 所需的 JSON你需要的输出。