我有以下两种型号
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字段。
那我怎么用这个序列化器创建节点?
答案 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')