Я не могу заставить DRF разрешить предоставление read_only версии вложенных данных и записываемой версии только идентификаторов в списке в одном сериализаторе. Мне кажется, что это ошибка, но обычно это просто означает, что я недостаточно хорошо разбираюсь в структуре и ошибаюсь в сообщении об ошибке.Django Rest Framework не отвечает на read_only на вложенные данные
class Individual(models.Model):
household = models.ForeignKey(
'household.Household',
null=True,
related_name="individuals")
name = models.CharField(
max_length=100, default='')
class Household(models.Model):
address_line1 = models.CharField(max_length=64, default='')
class IndividualListSerializer(serializers.ModelSerializer):
class Meta:
model = Individual
depth = 0
fields = ('url', 'id', 'name', 'household')
read_only_fields = fields
class HouseholdUpdateSerializer(serializers.ModelSerializer):
individuals_details = IndividualListSerializer(many=True, source='individuals', read_only=True)
class Meta:
model = Household
fields = ('id', 'address_line1', 'individuals', 'individuals_details')
read_only_fields = ('id', 'individuals_details')
ошибка возвращается как
AssertionError: The `.update()` method does not support writable nested fields by default. Write an explicit `.update()` method for serializer `household.serializers.HouseholdUpdateSerializer`, or set `read_only=True` on nested serializer fields. // Werkzeug Debugger</title>
Я использовал read_only на вложенном поле (которое необходимо в ответ на обновление). Однако ошибка все еще указывает на то, что я этого не делаю.
Если я полностью удаляю поле individuals
, individuals_details
возвращает считанные данные без ошибок, но поскольку он игнорирует отправленные данные individuals
, он не обновляет этот список.
Если я удалю поле individuals_details
, DRF принимает список individuals
и выполняет обновление по модели. Но тогда необходимых данных возврата нет.
Таким образом, хотя считываемый вложенный или записываемый список работает сам по себе, когда другой добавлен, сериализатор не работает.
Это кажется довольно распространенной областью людей, застрявших, и кажется, что ответы this SO question стали лучшей практикой для картины. Но по какой-то причине это не работает в моем коде. Возможно, из-за ManyToOne в моих моделях.
Возможно, я обойду это, изменив клиент для выполнения PUT для обновления, проигнорировав ответ, а затем сделайте отдельное GET, но это неряшливо и не нужно, если обновление DRF можно сделать работайте, как ожидалось.
Что мне недостает в этом?
Я не уверен, что 'read_only_fields' предназначен для работы с явно определенными полями. Как насчет удаления individual_details из 'read_only_fields'? Он исправляет? – Linovia
Также обратите внимание, что это анти-шаблон для использования как реляционного поля И вложенного сериализатора в ту же модель. – Linovia
Не моя цель - использовать как реляционные, так и вложенные. Но DRF не позволяет мне обновлять только идентификатор вложенных данных. Итак, каков хороший шаблон для получения информации о дочерних записях после изменения идентификаторов? – shanemgrey