Как определить сериализатор для модели с внешним ключом (не указывающим на поле pk, а на уникальное поле)? - PullRequest
0 голосов
/ 07 октября 2018

Я использую django rest-framework

Существует два режима, как показано ниже

class Service(ResourceModelBase):
    _id = models.UUIDField(unique=True, null=False, default=uuid.uuid1)
    access_key = models.CharField(max_length=200, unique=True, null=False)
    cluster = models.OneToOneField(Cluster, to_field='_id')

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

У службы есть точка внешнего ключа к уникальному ключу кластера в поле _id заметил, что _id не является первичным ключом, это уникальный ключ.Это важно для моего следующего вопроса .

Затем я определяю сериализатор для модели сервиса, чтобы я мог создавать и получать данные сервиса.

class ServiceSerializer(serializers.ModelSerializer):
    cluster_id = serializers.SlugRelatedField(queryset=models.Cluster.objects.all(), slug_field='_id')
    class Meta:
        model = models.RGW
        fields = ('_id', 'access_key', 'cluster_id')

Обратите внимание, что я определяю cluster_id как SlugRelatedField, а неthe PrimaryKeyRelatedField.

Причина для этого заключается в том, что я хочу передать cluster_id параметр для создания службы.

Если я определю cluster_id в качестве поля, связанного с первичным ключом, структура, как правило,думаю, что внешний ключ cluster_id указывает на столбец первичного ключа.Но в моем случае это не так.Он указывает на уникальное ключевое поле.

Поэтому я использую SlugRelatedField (я не уверен, что это правильный путь).Но появляется другая проблема.

Когда я отправляю данные на сериализатор.Данные, которые я отправляю, следующие:

{'cluster_id': 'ef3f70cac9e111e89fd1f000ac192ced', 'access_key': 'aaaa'}

Но данные после проверки serailzier равны

serializer.validated_data
OrderedDict([('access_key', 'aaaa'), ('cluster_id', <Cluster: Cluster object (2)>)])

По какой-то причине cluster_id преобразуется в объект кластера.Так что, если я запускаю

 serializer.save(serializer.validated_data) 

, это приведет к ошибке.

Конечно, я мог бы переписать метод сохранения.Но я просто хочу знать, как лучше всего это сделать.Я чувствую, что неправильно использую фреймворк

...