为什么Django Rest-frame工作的序列化程序中的外键字段变为只读?

时间:2018-10-06 11:46:25

标签: django django-rest-framework

我有以下两种型号

class Cluster(models.Model):

    _id = models.UUIDField(unique=True, null=False, default=uuid.uuid1)
    name = models.CharField(max_length=200, unique=True, null=False)

class Node(models.Model):
    _id = models.UUIDField(unique=True, null=False, default=uuid.uuid1)
    ip = models.GenericIPAddressField(null=False, unique=True)
    cluster = models.ForeignKey(Cluster, on_delete=models.PROTECT, to_field='_id')

如上所示。该节点将具有对集群的外键引用,这意味着该节点属于一个集群。 我使用唯一的字段_id作为外键而不是主键。

然后我创建一个序列化器

class NodeSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Node
        fields = ('_id', 'ip', 'cluster_id')

从数据库中检索数据时,串行器工作正常。但是创建

时有问题
>>> print(NodeSerializer())
NodeSerializer():
    _id = UUIDField(required=False, validators=[<UniqueValidator(queryset=Node.objects.all())>])
    ip = IPAddressField(validators=[<UniqueValidator(queryset=Node.objects.all())>])
    cluster_id = ReadOnlyField()

因为cluster_id为只读,所以serializer.validated_data始终会丢失cluster_id字段。

那我怎么用这个序列化器创建节点?

1 个答案:

答案 0 :(得分:0)

cluster_id是由ForeignKey生成的额外属性。您应该使用cluster使字段可写:

class NodeSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Node
        fields = ('_id', 'ip', 'cluster')

或使用带有源参数的PrimaryKeyRelatedField重命名序列化器级别的字段:

class NodeSerializer(serializers.ModelSerializer):
    cluster_id = serializers.PrimaryKeyRelatedField(source='cluster', queryset=Cluster.objects.all())

    class Meta:
        model = models.Node
        fields = ('_id', 'ip', 'cluster_id')