Как отправить плоские данные с помощью POST во вложенный сериализатор DRF - PullRequest
0 голосов
/ 25 октября 2018

У меня есть API, который может создавать тестовые прогоны, но мне нужен серийный номер инструмента для его создания.

Я бы хотел иметь такой запрос POST:

{
    "serial_number":"4331214L"
    "operator": "John Doe"
}

Но сейчас мне нужно сделать:

{
    "instrument": {
        "serial_number":"4331214L"
    },
    "operator": "John Doe"
}

текущих моделей:

class InstrumentModel(models.Model):
    class Meta:
        db_table = "instruments"
        verbose_name = "Instrument"

    serial_number = models.CharField(max_length=10, unique=True, db_index=True)

    def __str__(self):
        return self.serial_number


class TestRun(models.Model):
    class Meta:
        db_table = "test_runs"
        verbose_name = "Test run"

    operator = models.CharField(max_length=70)
    instrument = models.ForeignKey(InstrumentModel, related_name="instruments", db_column="instrument", on_delete=models.CASCADE)
    created_at = models.DateTimeField(db_index=True, default=timezone.now)

Я пробовал с мета-полем глубины.Это не работаетМожет дело не в уровне сериализатора?

class TestRunSerializer(serializers.ModelSerializer):
    instrument = InstrumentSerializer()

    class Meta:
        model = TestRun
        fields = ('operator', 'instrument')
        depth = 1

    def create(self, validated_data):
        serial_number = validated_data.pop('serial_number')
        instrument, _ = InstrumentModel.objects.get_or_create(serial_number=serial_number)
        return TestRun.objects.create(**validated_data, instrument=instrument)

1 Ответ

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

Я думаю, что это может быть правильно, если вы использовали to_internal_value

class TestRunSerializer(serializers.ModelSerializer):
    instrument = InstrumentSerializer()

    class Meta:
        model = TestRun
        fields = ('operator', 'instrument')
        depth = 1
   def to_internal_value(self, data):
        serial_number = obj.get('serial_number')
        if not serial_number:
             raise serializers.ValidationError({
            'serial_number': 'This field is required.'
        })
        data['insturment'] = {'serial_number': serial_number}
        return data
...