Правильный способ получения/создания вложенных объектов с помощью DRF?

У меня есть следующие модели:

class Platform(models.Model): # Get
    key = models.CharField(max_length=32, unique=True)

class PlatformVersion(models.Model): # Get or create
    platform = models.ForeignKey(Platform, on_delete=models.CASCADE)
    major = models.IntegerField(db_index=True)
    minor = models.IntegerField(db_index=True)
    build = models.IntegerField(db_index=True)

class DeviceManufacturer(models.Model): # Get or create
    name = models.CharField(max_length=64, unique=True)

class DeviceModel(models.Model): # Get or create
    manufacturer = models.ForeignKey(DeviceManufacturer, on_delete=models.CASCADE)
    platform = models.ForeignKey(Platform, on_delete=models.CASCADE)
    # ...

# And many others

POST JSON выглядит следующим образом:

{
   "device_model": {
       "manufacturer": {
          "name": "samsung"
       },
       "platform": {
          "key": "android"
       }
   },
   "version": {
       "platform": {
          "key": "android"
       },
       "major": 8,
       "minor": 1,
       "build": 0
   }
}

У меня есть следующие сериализаторы:

class PlatformSerializer(serializers.ModelSerializer):
    class Meta:
        model = Platform
        fields = ('name', 'key',)

        extra_kwargs = {
            'name': {
                'read_only': True,
            },
        }

    def create(self, validated_data):
        return Platform.objects.get(key=validated_data['key'])

class PlatformVersionSerializer(serializers.ModelSerializer):
    platform = PlatformSerializer()

    class Meta:
        model = PlatformVersion
        fields = ('platform', 'major', 'minor', 'build',)


    def create(self, validated_data):
        # ?
        pass

class DeviceManufacturerSerializer(serializers.ModelSerializer):
    class Meta:
        model = DeviceManufacturer
        fields = ('name',)

    def create(self, validated_data):
        manufacturer, _ = DeviceManufacturer.objects.get_or_create(
            defaults={
                'name': validated_data['name'],
            },
            name=validated_data['name']
        )

        return manufacturer

class DeviceModelSerializer(serializers.ModelSerializer):
    manufacturer = DeviceManufacturerSerializer()
    platform = PlatformSerializer()

    class Meta:
        model = DeviceModel
        fields = ('manufacturer', 'platform')

    def create(self, validated_data):
        # ?
        pass

Я отметил в сериализаторах места, где я не знаю, как правильно сделать создание объекта, так как некоторые из вложенных объектов "только для чтения" (я имею в виду, что на самом деле я использую get, а не create), некоторые get or create.

Как я должен это сделать?

Вернуться на верх