DRFを使用して、ネストされたデータのread_onlyバージョンと、ただ1つのシリアライザのリスト内のIDの書き込み可能バージョンを提供することはできません。それは私のバグのように感じますが、通常は、フレームワークを十分に理解できず、エラーメッセージに惑わされているだけです。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')
エラーは、私が(更新に応じて、必要とされている)、ネストされたフィールド上でread_onlyが使用している
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>
として戻ってきます。しかし、エラーはまだ私がそうしていないことを示しています。フィールドを完全に削除した場合、individuals_details
はエラーなしで読み取り可能なデータを返しますが、送信中のデータは無視されているため、そのリストは更新されていません。
individuals_details
フィールドを削除すると、DRFはindividuals
リストを受け入れ、モデルの更新を実行します。しかし、必要なリターンデータは存在しません。
したがって、読み込みネストされたリストまたは書き込みリストのいずれかが単独で機能している間に、もう一方が追加されるとシリアライザは機能しません。
これは非常に一般的な領域の人々が立ち往生していると思われます。答えはthis SO questionパターンのベストプラクティスになっているようです。しかし、私のコードで何らかの理由で動作しません。多分私のモデルのManyToOneのために。
私はおそらく、更新のためにPUTを実行し、応答を無視して別のGETを実行するようクライアントを変更することで対処できますが、DRFの更新を行うことができない期待どおりに動作します。
私はこれで何が欠けていますか?
'read_only_fields'は、明示的に定義されたフィールドで動作することを意味していません。 'read_only_fields'からindivid_detailsを削除するのはどうですか?それは修正されますか? – Linovia
これは、同じモデルに対してリレーショナルフィールドとネストされたシリアライザの両方を使用するための反パターンです。 – Linovia
リレーショナルとネストの両方を使用することは私の目標ではありません。しかし、DRFではネストされたデータのIDだけを更新することはできません。どのIDが関連しているかを変更した後、子レコードの詳細を取得するための良いパターンは何ですか? – shanemgrey