Django REST:按UUID查找序列化程序

2024-06-16 12:03:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Django REST中创建这个简单的购物API。在

在内部,我将id用于外键约束,而guuids则被引入外部世界。在

对于结帐过程,用户提供他愿意购买的物品id的列表。因此,POST数据中的对象如下所示:

{
  assets: [
    {
       'product': 'd9d5044d-2284-4d15-aa76-2eee3675035b',
       'amount': 4
    },
    ....
  ]
}

使用以下资产模型:

^{pr2}$

序列化程序如下所示:

# Asset serializer
class AssetSerializer(serializers.ModelSerializer):

    class Meta:
        model = Asset
        fields = ('stock_item', 'amount')


# Ticket serializer
class TicketSerializer(WritableNestedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    assets = AssetSerializer(many=True)

    class Meta:
        model = Ticket
        fields = ('uuid', 'owner', 'assets', )

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

过帐上述指定类型的对象时,会出现以下错误:

{"assets":[{"stock_item": ["Invalid type. Expected PK, received string"]}]}

我似乎无法解决这个问题,如何指示序列化程序使用uuid作为查找值?我在前面通过使用lookup_field成员解决了视图级别上的一个类似问题,但这似乎不能解决问题。有什么建议吗?
在此处输入代码


Tags: 对象程序idfieldsmodel序列化assetamount
1条回答
网友
1楼 · 发布于 2024-06-16 12:03:01

如果我正确地理解了您,那么SlugRelatedField应该能够找到正确的相关对象。在

class AssetSerializer(serializers.ModelSerializer):
    ticket = serializers.SlugRelatedField(
        read_only=True,
        slug_field='uuid',
        queryset=Ticket.objects.all() # Might be redundant with read_only=True
    )

    class Meta:
        model = Asset
        fields = ('ticket', 'stock_item', 'amount')

相关问题 更多 >