Django Rest Framework:如何将嵌套关系的 UUID 列表传递给序列化程序?
Django Rest Framework: How to pass a list of UUIDs for a nested relationship to a serializer?
TL;DR:我的一个序列化程序的传入数据未得到处理的原因可能是什么?
我正在为嵌套关系开发序列化程序。序列化器应该得到一个 UUID 列表,这样我就可以建立多对多关系。这是模型:
class Order(
UniversallyUniqueIdentifiable,
SoftDeletableModel,
TimeStampedModel,
models.Model
):
menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
custom_choice_items = models.ManyToManyField(CustomChoiceItem, blank=True)
price = models.ForeignKey(MenuItemPrice, on_delete=models.CASCADE)
amount = models.PositiveSmallIntegerField(
validators=[MinValueValidator(MINIMUM_ORDER_AMOUNT)]
)
这是我在测试中使用的数据(我的 post body):
data = {
"checkin_uuid": self.checkin.uuid,
"custom_choice_items": [],
"menu_item": self.menu_item.uuid,
"price": self.menu_item_price.uuid,
"amount": ORDER_AMOUNT,
}
response = self.client.post(self.order_consumer_create_url, self.data)
请注意,custom_choice_items
的空列表不会改变任何内容。即使我用值填充它,也会发生同样的错误。最后但并非最不重要的是序列化程序:
class CustomChoiceItemUUIDSerializer(serializers.ModelSerializer):
"""Serializer just for the uuids, which is used when creating orders."""
class Meta:
model = CustomChoiceItem
fields = ["uuid"]
....
# The serializer that does not work
class OrderSerializer(serializers.ModelSerializer):
menu_item = serializers.UUIDField(source="menu_item.uuid")
custom_choice_items = CustomChoiceItemUUIDSerializer()
price = serializers.UUIDField(source="price.uuid")
wish = serializers.CharField(required=False)
class Meta:
model = Order
fields = [
"uuid",
"menu_item",
"custom_choice_items",
"price",
"amount",
"wish",
]
现在的问题是,当我遗漏 many=True
时,出现错误:
{'custom_choice_items': [ErrorDetail(string='This field is required.', code='required')]}
如果我设置 many=True
,我就不会得到任何数据。我的意思是例如序列化程序 create()
方法中 validated_data["custom_choice_items"]
的值只是空的。
这里出了什么问题?
我什至检查过请求中的数据 self.context["request"].data
包括一个键 custom_choice_items
我将数据传递给此视图的方式!
编辑:这是我传递给 custom_choice_items 的数据:
data = {
“checkin_uuid”: self.checkin.uuid,
“custom_choice_items”: [{“uuid”: custom_choice_item.uuid}],
“menu_item”: self.menu_item.uuid,
“price”: self.menu_item_price.uuid,
“amount”: ORDER_AMOUNT,
}
self.client.credentials(HTTP_AUTHORIZATION=“Token ” + self.token.key)
response = self.client.post(self.order_consumer_create_url, data)
你是否覆盖了序列化程序中的 .create
方法?这样的事情应该有效:
from django.db import transaction
class OrderSerializer(serializers.ModelSerializer):
# your fields and Meta class here
@transaction.atomic
def create(self, validated_data):
custom_choice_items = validated_data.pop('custom_choice_items')
order = super().create(validated_data)
order.custom_choice_items.add(*custom_choice_items)
return order
顺便说一句,你真的不需要定义 CustomChoiceItemUUIDSerializer
if 只是它的主键。
当你post数据使用测试api客户端时,如果数据包含嵌套结构你应该使用format=json
,像这样:
response = self.client.post(self.order_consumer_create_url, data, format='json')
TL;DR:我的一个序列化程序的传入数据未得到处理的原因可能是什么?
我正在为嵌套关系开发序列化程序。序列化器应该得到一个 UUID 列表,这样我就可以建立多对多关系。这是模型:
class Order(
UniversallyUniqueIdentifiable,
SoftDeletableModel,
TimeStampedModel,
models.Model
):
menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
custom_choice_items = models.ManyToManyField(CustomChoiceItem, blank=True)
price = models.ForeignKey(MenuItemPrice, on_delete=models.CASCADE)
amount = models.PositiveSmallIntegerField(
validators=[MinValueValidator(MINIMUM_ORDER_AMOUNT)]
)
这是我在测试中使用的数据(我的 post body):
data = {
"checkin_uuid": self.checkin.uuid,
"custom_choice_items": [],
"menu_item": self.menu_item.uuid,
"price": self.menu_item_price.uuid,
"amount": ORDER_AMOUNT,
}
response = self.client.post(self.order_consumer_create_url, self.data)
请注意,custom_choice_items
的空列表不会改变任何内容。即使我用值填充它,也会发生同样的错误。最后但并非最不重要的是序列化程序:
class CustomChoiceItemUUIDSerializer(serializers.ModelSerializer):
"""Serializer just for the uuids, which is used when creating orders."""
class Meta:
model = CustomChoiceItem
fields = ["uuid"]
....
# The serializer that does not work
class OrderSerializer(serializers.ModelSerializer):
menu_item = serializers.UUIDField(source="menu_item.uuid")
custom_choice_items = CustomChoiceItemUUIDSerializer()
price = serializers.UUIDField(source="price.uuid")
wish = serializers.CharField(required=False)
class Meta:
model = Order
fields = [
"uuid",
"menu_item",
"custom_choice_items",
"price",
"amount",
"wish",
]
现在的问题是,当我遗漏 many=True
时,出现错误:
{'custom_choice_items': [ErrorDetail(string='This field is required.', code='required')]}
如果我设置 many=True
,我就不会得到任何数据。我的意思是例如序列化程序 create()
方法中 validated_data["custom_choice_items"]
的值只是空的。
这里出了什么问题?
我什至检查过请求中的数据 self.context["request"].data
包括一个键 custom_choice_items
我将数据传递给此视图的方式!
编辑:这是我传递给 custom_choice_items 的数据:
data = {
“checkin_uuid”: self.checkin.uuid,
“custom_choice_items”: [{“uuid”: custom_choice_item.uuid}],
“menu_item”: self.menu_item.uuid,
“price”: self.menu_item_price.uuid,
“amount”: ORDER_AMOUNT,
}
self.client.credentials(HTTP_AUTHORIZATION=“Token ” + self.token.key)
response = self.client.post(self.order_consumer_create_url, data)
你是否覆盖了序列化程序中的 .create
方法?这样的事情应该有效:
from django.db import transaction
class OrderSerializer(serializers.ModelSerializer):
# your fields and Meta class here
@transaction.atomic
def create(self, validated_data):
custom_choice_items = validated_data.pop('custom_choice_items')
order = super().create(validated_data)
order.custom_choice_items.add(*custom_choice_items)
return order
顺便说一句,你真的不需要定义 CustomChoiceItemUUIDSerializer
if 只是它的主键。
当你post数据使用测试api客户端时,如果数据包含嵌套结构你应该使用format=json
,像这样:
response = self.client.post(self.order_consumer_create_url, data, format='json')