【发布时间】:2018-06-20 06:50:33
【问题描述】:
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)]
)
这是我在测试中使用的数据(我的帖子正文):
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)
【问题讨论】:
-
uuid是CustomChoiceItem模型的主键吗?您可以分享已发布请求的正文吗? -
@neverwalkaloner UUID 不是
customchoiceitem的主键。帖子请求的正文是数据中的内容(我编辑了帖子):) -
我的意思是你能添加你通过
custom_choice_items传递的内容吗?:)uuid对 CustomChoiceItem 来说是唯一的吗? -
@neverwalkaloner 当然我添加了它:)
标签: django django-rest-framework django-testing django-serializer django-tests