我有以下型号:
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
字段。
为什么行为不对称?我在这里做错了吗?