如何为带有外键(不是指向pk字段而是唯一字段)的模型定义序列化器?

时间:2018-10-07 04:33:58

标签: django django-rest-framework

我正在使用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方法。但是我只想知道什么是最好的方法。我觉得我使用框架的方式错误

0 个答案:

没有答案