В 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.
Но в rest-framework django при определении сериализатора
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?