Вынуждает ли django rest-framework внешний ключ указывать на первичный ключ? - PullRequest
0 голосов
/ 06 октября 2018

В 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?

1 Ответ

0 голосов
/ 06 октября 2018

Я думаю, что вы ищете SlugRelatedField :

cluster_id = serializers.SlugRelatedField(
        source='cluster', slug_field='_id', queryset=models.Cluster.objects.all())
...