Django REST:通过 UUID 查找序列化程序

Iso*_*Iso 4 python django django-models django-rest-framework

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

在内部,我将 ID 用于外键约束,而guuids被带到外部世界。

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

{
  assets: [
    {
       'product': 'd9d5044d-2284-4d15-aa76-2eee3675035b',
       'amount': 4
    },
    ....
  ]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下票据/资产模型:

# Ticket
class Ticket(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='tickets', on_delete=models.CASCADE)


# Assets
class Asset(models.Model):
    ticket = models.ForeignKey(Ticket, related_name='assets', on_delete=models.CASCADE)
    stock_item = models.ForeignKey(Stock, related_name='stock_item', on_delete=models.SET_NULL, null=True)
    amount = models.IntegerField(validators=[MinValueValidator(0)])
Run Code Online (Sandbox Code Playgroud)

序列化程序如下所示:

# 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)
Run Code Online (Sandbox Code Playgroud)

发布上述类型的对象时,会出现以下错误:

{"assets":[{"stock_item": ["Invalid type. Expected PK, received string"]}]}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*han 5

如果我理解正确,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')
Run Code Online (Sandbox Code Playgroud)