Я использую 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)
, это приведет к ошибке.
Конечно, я мог бы переписать метод сохранения.Но я просто хочу знать, как лучше всего это сделать.Я чувствую, что неправильно использую фреймворк