我正在使用Django rest-framework
有以下两种模式
class Service(ResourceModelBase):
_id = models.UUIDField(unique=True, null=False, default=uuid.uuid1)
access_key = models.CharField(max_length=200, unique=True, null=False)
cluster = models.OneToOneField(Cluster, to_field='_id')
class Cluster(ResourceModelBase):
_id = models.UUIDField(unique=True, null=False, default=uuid.uuid1)
name = models.CharField(max_length=200, unique=True, null=False)
该服务具有指向集群唯一键_id字段的外键。请注意,_id不是主键,它是唯一键。这是 对我以后的问题很重要。
然后,我为服务模型定义一个序列化器,以便我可以创建和获取服务数据。
class ServiceSerializer(serializers.ModelSerializer):
cluster_id = serializers.SlugRelatedField(queryset=models.Cluster.objects.all(), slug_field='_id')
class Meta:
model = models.RGW
fields = ('_id', 'access_key', 'cluster_id')
请注意,我将 cluster_id定义为SlugRelatedField,而不是PrimaryKeyRelatedField。
这样做的原因是我想将cluster_id传递给一个参数来创建服务。
如果我将cluster_id定义为与主键相关的字段,则框架倾向于认为cluster_id外键指向主键列。但就我而言,事实并非如此。它指向唯一的键字段。
所以我使用SlugRelatedField(我不确定这是否是正确的方法)。但是出现了另一个问题。
当我向串行器发送数据时。我发送的数据如下:
{'cluster_id': 'ef3f70cac9e111e89fd1f000ac192ced', 'access_key': 'aaaa'}
但是经过serailzier验证的数据是
serializer.validated_data
OrderedDict([('access_key', 'aaaa'), ('cluster_id', <Cluster: Cluster object (2)>)])
由于某种原因,cluster_id被转换为集群对象。因此,如果我运行
serializer.save(serializer.validated_data)
这将导致错误。
我当然可以重写save方法。但是我只想知道什么是最好的方法。我觉得我使用框架的方式错误