我正在使用Django Rest Framework编写我的API。我想在序列化器中写入与id(特别是uuid)不同的值。
首先让我给您基本设置。我有一个名为House
的模型,除其他值外,还有一个pk和一个uuid。我还有一个名为Citizen
的第二个模型,它也有一个pk和一个uuid。 House
和Citizen
彼此之间具有ManyToMany关系。
我想拥有一个序列化器,该序列化器只返回其居民数组。
这是我尝试过(但失败)的无效伪代码:
class HouseSerializer(serializers.ModelSerializer):
address = AddressSerializer()
citizen = serializers.UUIDField(source="citizen.uuid")
class Meta:
model = Table
fields = [
"uuid",
"address",
"citizen",
...
]
此序列化器引发错误:
AttributeError: Got AttributeError when attempting to get a value for field `citizen` on serializer `HouseListSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `House` instance.
Original exception text was: 'ManyRelatedManager' object has no attribute 'uuid'.
但是在我的House
模型上,我明确地拥有citizen = models.ManyToManyField(Citizen)
。
如果我不指定任何序列化程序,而只将公民保留在fields数组中,那么我只会得到一个我无法使用的PK数组。
如何在这里获取UUID数组?
答案 0 :(得分:2)
首先,您需要为Citizen模型使用一个序列化程序类。
class CitizenSerializer(serializers.ModelSerializer):
uuid = serializers.UUIDField(read_only=True)
class Meta:
model = Citizen
fields = ('uuid', )
然后,我们会将CitizenSerializer
添加到您的HouseSerializer
中。请注意,我们需要many=True
关系的ManyToManyField
参数。
class HouseSerializer(serializers.ModelSerializer):
address = AddressSerializer()
citizen = CitizenSerializer(read_only=True, many=True)
class Meta:
...
您可以了解有关此here
的更多信息答案 1 :(得分:1)
您可以像这样使用SlugRelatedField:
class HouseSerializer(serializers.ModelSerializer):
address = AddressSerializer()
citizen = serializers.SlugRelatedField( many=True,
read_only=True,
slug_field='uuid')
阅读drf doc以获得更多信息。