代码之家  ›  专栏  ›  技术社区  ›  LaurensVijnck

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

  •  0
  • LaurensVijnck  · 技术社区  · 6 年前

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Johan    6 年前

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