Django Rest Framework:只需获取 ManyToMany 关系的某些值
Django Rest Framework: Just get certain values of a ManyToMany relationship
我正在使用 Django Rest Framework 编写我的 API。我想将与 id(特别是 uuid)不同的值写入我的序列化程序。
让我先给你基本的设置。我有一个名为 House
的模型,其中有一个 pk 和一个 uuid。我还有一个名为 Citizen
的第二个模型,它也有一个 pk 和一个 uuid。 House
和 Citizen
彼此之间存在多对多关系。
我想要一个序列化器,它只返回一个它的公民数组。
这是我尝试过(但失败了)的无效伪代码:
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)
。
如果我只是不指定任何序列化程序而只是将公民留在字段数组中,我只会得到一个我无法使用的 PK 数组。
如何在此处获取 UUID 数组?
首先,您的 Citizen 模型需要一个序列化程序 class。
class CitizenSerializer(serializers.ModelSerializer):
uuid = serializers.UUIDField(read_only=True)
class Meta:
model = Citizen
fields = ('uuid', )
然后我们会将 CitizenSerializer
添加到您的 HouseSerializer
。请注意,我们需要 ManyToManyField
关系的 many=True
参数。
class HouseSerializer(serializers.ModelSerializer):
address = AddressSerializer()
citizen = CitizenSerializer(read_only=True, many=True)
class Meta:
...
您可以阅读更多相关内容here
您可以像这样使用 SlugRelatedField:
class HouseSerializer(serializers.ModelSerializer):
address = AddressSerializer()
citizen = serializers.SlugRelatedField( many=True,
read_only=True,
slug_field='uuid')
阅读 drf doc 了解更多信息。
我正在使用 Django Rest Framework 编写我的 API。我想将与 id(特别是 uuid)不同的值写入我的序列化程序。
让我先给你基本的设置。我有一个名为 House
的模型,其中有一个 pk 和一个 uuid。我还有一个名为 Citizen
的第二个模型,它也有一个 pk 和一个 uuid。 House
和 Citizen
彼此之间存在多对多关系。
我想要一个序列化器,它只返回一个它的公民数组。
这是我尝试过(但失败了)的无效伪代码:
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)
。
如果我只是不指定任何序列化程序而只是将公民留在字段数组中,我只会得到一个我无法使用的 PK 数组。
如何在此处获取 UUID 数组?
首先,您的 Citizen 模型需要一个序列化程序 class。
class CitizenSerializer(serializers.ModelSerializer):
uuid = serializers.UUIDField(read_only=True)
class Meta:
model = Citizen
fields = ('uuid', )
然后我们会将 CitizenSerializer
添加到您的 HouseSerializer
。请注意,我们需要 ManyToManyField
关系的 many=True
参数。
class HouseSerializer(serializers.ModelSerializer):
address = AddressSerializer()
citizen = CitizenSerializer(read_only=True, many=True)
class Meta:
...
您可以阅读更多相关内容here
您可以像这样使用 SlugRelatedField:
class HouseSerializer(serializers.ModelSerializer):
address = AddressSerializer()
citizen = serializers.SlugRelatedField( many=True,
read_only=True,
slug_field='uuid')
阅读 drf doc 了解更多信息。