社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

django rest:按uuid查找序列化程序

Iso • 7 年前 • 1573 次点击  

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

在内部,我使用ID进行外键约束,而 guuids 被带到外面的世界。

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

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

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

# 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 成员,但这似乎不能解决问题。有什么建议吗?
在这里输入代码

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30632
 
1573 次点击  
文章 [ 1 ]  |  最新文章 7 年前
Johan
Reply   •   1 楼
Johan    7 年前

如果我对你的理解正确, 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')