ModelSerializer требует данные поля из экземпляра - PullRequest
0 голосов
/ 18 февраля 2019

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

class TrackGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = TrackGroup
        fields = ('id', 'name', 'report', 'tracks')  # `report` is FK

Я беру идентификатор отчета из URL, поэтому я думаю, что это будет работать:

...
track_group = TrackGroup(report=report)
serializer = TrackGroupSerializer(
    instance=track_group,
    context=dict(request=request),
    data=request.data
)

if serializer.is_valid():
    ...

Это не работает, потому что сериализатор имеетошибка для поля report, так как поле отсутствует и является обязательным.Как правильно предоставить данные типа report и по-прежнему указывать их в полях TrackGroupSerializer, поскольку этот сериализатор используется для возврата всех данных в ответ.

Спасибо

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Вы можете установить данные как dict со всеми ключами, а не как request.data, вот так

data = {'report': report.id, **request.data}

serializer = TrackGroupSerializer(
    instance=track_group,
    context=dict(request=request),
    data=data
)
0 голосов
/ 27 февраля 2019

Правильное решение кажется partial=True:

serializer = TrackGroupSerializer(
    instance=track_group,
    context=dict(request=request),
    data=request.data,
    partial=True
)

Кажется, что оно чище, чем изменение данных запроса.

0 голосов
/ 18 февраля 2019

Установите требуемый флаг в False в сериализаторе модели

class TrackGroupSerializer(serializers.ModelSerializer):
    report = serializers.CharField(required=False)
    class Meta:
        model = TrackGroup
        fields = ('report', ...)

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

В models.py

class TrackGroup(models.Model):
    report  = models.CharField(default = '-')
...