[解決済み] Django rest フレームワークのネストされた自己参照オブジェクト
2022-11-20 22:22:15
質問
以下のようなモデルを持っています。
class Category(models.Model):
parentCategory = models.ForeignKey('self', blank=True, null=True, related_name='subcategories')
name = models.CharField(max_length=200)
description = models.CharField(max_length=500)
シリアライザーを使って、全カテゴリーのフラットなjson表現を得ることができました。
class CategorySerializer(serializers.HyperlinkedModelSerializer):
parentCategory = serializers.PrimaryKeyRelatedField()
subcategories = serializers.ManyRelatedField()
class Meta:
model = Category
fields = ('parentCategory', 'name', 'description', 'subcategories')
今私がしたいことは、サブカテゴリのリストが、そのIDの代わりにサブカテゴリのインラインjson表現を持つようにすることです。どのように私はdjango-rest-frameworkでそれを行うのでしょうか?私はドキュメントでそれを見つけようとしましたが、それは不完全なようです。
どのように解決するのですか?
ManyRelatedFieldを使う代わりに、ネストされたシリアライザをフィールドとして使います。
class SubCategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ('name', 'description')
class CategorySerializer(serializers.ModelSerializer):
parentCategory = serializers.PrimaryKeyRelatedField()
subcategories = serializers.SubCategorySerializer()
class Meta:
model = Category
fields = ('parentCategory', 'name', 'description', 'subcategories')
もし、任意にネストされたフィールドを扱いたい場合は デフォルトのフィールドをカスタマイズする の部分を見てください。 現在、シリアライザーをそれ自身のフィールドとして直接宣言することはできませんが、これらのメソッドを使用して、デフォルトで使用されるフィールドをオーバーライドすることができます。
class CategorySerializer(serializers.ModelSerializer):
parentCategory = serializers.PrimaryKeyRelatedField()
class Meta:
model = Category
fields = ('parentCategory', 'name', 'description', 'subcategories')
def get_related_field(self, model_field):
# Handles initializing the `subcategories` field
return CategorySerializer()
実は、ご指摘の通り、上記は全く正しいものではありません。 これは少しハックですが、シリアライザがすでに宣言された後にフィールドを追加してみてはいかがでしょうか。
class CategorySerializer(serializers.ModelSerializer):
parentCategory = serializers.PrimaryKeyRelatedField()
class Meta:
model = Category
fields = ('parentCategory', 'name', 'description', 'subcategories')
CategorySerializer.base_fields['subcategories'] = CategorySerializer()
再帰的な関係を宣言する仕組みは、追加する必要があるものです。
編集 : この種のユースケースに特化したサードパーティのパッケージが利用できるようになったことに注意してください。参照 djangorestframework-recursive .
関連
-
Django QuerySet マルチテーブル結合/条件付きピッキング/マージ
-
Django ForeignKey逆引きクエリにおけるfilterと_setの効率比較
-
[解決済み] NoReverseMatchエラーとは何ですか、またどのように修正しますか?
-
[解決済み] Django のビューで 2 つ以上のクエリセットを結合するにはどうすればよいですか?
-
[解決済み] Django のカスタムフィールドで User モデルを拡張する
-
[解決済み] Django のフォームで、あるフィールドを編集できないように readonly (または disabled) にするにはどうしたらいいですか?
-
[解決済み] Django テンプレート内で現在の URL を取得する方法は?
-
[解決済み] models.pyでDjangoの設定変数を参照するには?
-
[解決済み] Django Southを使用して移行履歴をリセットするための推奨される方法は何ですか?
-
[解決済み] Django: テンプレート内からセッション変数にアクセスする?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ユニコードオブジェクトはハッシュ化する前にエンコードする必要がある問題を解決
-
django request.data を修正する AttributeError: 属性を設定できない
-
AttributeError: 'str' オブジェクトには 'decode' という属性がありません。
-
[解決済み] Django vs. Model View Controller [終了しました]。
-
[解決済み】Djangoでモデルインスタンスをシリアライズする方法は?
-
[解決済み] Djangoアプリの命名規則はありますか?
-
[解決済み] egg_infoエラーでpipからインストールできない
-
[解決済み] list_display - メソッド用のブール型アイコンです。
-
[解決済み] django のモデルのクラス名を取得する
-
[解決済み] Django Rest フレームワーク。フィールドのサブセットを動的に返す