ModelSerializer的不对称行为

时间:2018-04-10 14:59:49

标签: django django-rest-framework

我有以下型号:

class Brand(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=30, blank=False, null=False)

class Product(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False)
    brand = models.ForeignKey('Brand', on_delete=models.CASCADE, null=True)

我正在为产品型号编写ModelSerializer:

class ProductSerializer(serializers.ModelSerializer):
    brand = serializers.UUIDField(source='brand.uuid', default=None)
    class Meta:
        model = models.Product
        fields = ('uuid', 'brand', )
        read_only_fields = ('uuid',)

现在转到shell来序列化/反序列化产品对象。首先让我们反序列化Product实例:

In [1]: product = Product.objects.all().first()

In [2]: ProductSerializer(product)
Out[2]: 
ProductSerializer(<Product: Product object (2)>):
    uuid = UUIDField(read_only=True)
    brand = UUIDField(default=None, source='brand.uuid')

In [3]: ProductSerializer(product)['brand'] 
Out[3]: <BoundField value=1b03c6e1-8d9c-4273-ad07-d0d59a7f8cd9 errors=None>

因此,正如预期的那样,字段'品牌'是正常的UUID字段。现在反过来(序列化):

In [4]: data = {'brand': '1b03c6e1-8d9c-4273-ad07-d0d59a7f8cd9', }

In [5]: serializer = ProductSerializer(data=data)

In [6]: serializer.is_valid()
Out[6]: True

In [7]: serializer.validated_data
Out[7]: 
OrderedDict([('brand', {'uuid': UUID('1b03c6e1-8d9c-4273-ad07-d0d59a7f8cd9')})])

In [8]: serializer.validated_data['brand'] 
Out[8]: {'uuid': UUID('1b03c6e1-8d9c-4273-ad07-d0d59a7f8cd9')}

所以这就是问题:在一种方式(反序列化)中,brand是Brand实例的UUID,正如ProductSerializer中的声明所预期的那样。 在另一种方式(序列化)中,brand指向一个字典,其中包含一个名为“uuid”的键,用于指代品牌的UUID。好像DRF正在管理嵌套关系,但仍使用brand字段声明将数据限制为Brand模型的uuid字段。

为什么行为不对称?我在这里做错了吗?

0 个答案:

没有答案