在django中,定义一个指向唯一键列而不是主键的外键是绝对好的。例如
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', db_constraint=False)
请注意,此处的_id字段不是pk字段。
但是在Django rest-framework中,定义序列化器
class NodeSerializer(serializers.ModelSerializer):
cluster_id = serializers.PrimaryKeyRelatedField(
source='cluster', queryset=models.Cluster.objects.all())
class Meta:
model = models.Node
fields = ('_id', 'name', 'ip', 'cluster_ip', 'cluster_id')
序列化程序将认为cluster_id指向集群的pk字段。
有什么办法可以告诉序列化程序cluster_id没有指向pk吗?
答案 0 :(得分:1)
我认为您正在寻找SlugRelatedField:
cluster_id = serializers.SlugRelatedField(
source='cluster', slug_field='_id', queryset=models.Cluster.objects.all())