Django Rest Framework:如何将嵌套关系的UUID列表传递给序列化程序?

问题描述 投票:1回答:2

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我只是没有得到任何数据。我的意思是,例如序列化器validated_data["custom_choice_items"]方法中create()的值只是空的。

这里出了什么问题?

我甚至检查数据是否在请求中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)
django django-rest-framework django-testing django-serializer django-tests
2个回答
1
投票

使用test api客户端发布数据时,如果数据包含嵌套结构,则应使用format=json,如下所示:

response = self.client.post(self.order_consumer_create_url, data, format='json')

0
投票

你在序列化器中覆盖了.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,如果只是那个主键。

© www.soinside.com 2019 - 2024. All rights reserved.