我正在 Django REST 中创建这个简单的购物 API。
在内部,我使用 ID 作为外键约束,而 guuids
被带到外面的世界。
对于结帐过程,用户提供他愿意购买的商品 ID 列表。因此,POST 数据中的对象如下所示:
{
assets: [
{
'product': 'd9d5044d-2284-4d15-aa76-2eee3675035b',
'amount': 4
},
....
]
}
我正在使用以下票据/ Assets 模型:
# 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)])
序列化程序如下所示:
# 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
在 View 级别解决了类似的问题成员,但这似乎并没有解决它。有什么建议?在此处输入代码
最佳答案
如果我没理解错的话,是 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')
关于python - Django REST : Serializer lookup by UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52507413/