[解決済み] Django Rest Frameworkでネストされたシリアライザーをどのようにフィルタリングしますか?
2022-11-23 16:52:53
質問
Django Rest Framework において、シリアライザが他のシリアライザにネストされている場合、どのようにフィルタリングするのでしょうか?
私のフィルタは DRF のビューセットで課されますが、他のシリアライザ内部からシリアライザを呼び出すと、ネストしたシリアライザのビューセットは決して呼び出されないので、ネストした結果はフィルタリングされずに表示されます。
元のビューセットにフィルターを追加してみましたが、ネストされた結果は別のプリフライトされたクエリーとして呼び出されるため、ネストされた結果をフィルターすることはできないようです。(ネストされたシリアライザーは逆引きですからね)。
ネストされたシリアライザ自体に get_queryset() オーバーライドを追加して (ビューセットの外に移動して)、そこにフィルタを追加することは可能でしょうか。私もそれを試しましたが、うまくいきませんでした。
これは私が試したものですが、呼び出されることさえないようです。
class QuestionnaireSerializer(serializers.ModelSerializer):
edition = EditionSerializer(read_only=True)
company = serializers.StringRelatedField(read_only=True)
class Meta:
model = Questionnaire
def get_queryset(self):
query = super(QuestionnaireSerializer, self).get_queryset(instance)
if not self.request.user.is_staff:
query = query.filter(user=self.request.user, edition__hide=False)
return query
どのように解決するのですか?
をサブクラス化することで
リストシリアライザ
を上書きし
to_representation
メソッドを上書きします。
デフォルトでは
to_representation
メソッドは
data.all()
をネストされたクエリセット上で呼び出します。ですから、事実上
data = data.filter(**your_filters)
を作る必要があります。それから、ネストされたシリアライザのメタ上に list_serializer_class としてサブクラス化された ListSerializer を追加する必要があります。
-
サブクラスListSerializerを上書きします。
to_representation
を書き、スーパー -
サブクラス化されたListSerializerをメタとして追加します。
list_serializer_class
をネストされたSerializerの上に追加します。
以下は、サンプルに関連するコードです。
class FilteredListSerializer(serializers.ListSerializer):
def to_representation(self, data):
data = data.filter(user=self.context['request'].user, edition__hide=False)
return super(FilteredListSerializer, self).to_representation(data)
class EditionSerializer(serializers.ModelSerializer):
class Meta:
list_serializer_class = FilteredListSerializer
model = Edition
class QuestionnaireSerializer(serializers.ModelSerializer):
edition = EditionSerializer(read_only=True)
company = serializers.StringRelatedField(read_only=True)
class Meta:
model = Questionnaire
関連
-
AttributeError: 'str' オブジェクトには 'decode' という属性がありません。
-
Django の ForeignKey パラメータの使用法
-
[解決済み] (13: Permission denied) 上流:[nginx]に接続中。
-
[解決済み】Djangoでモデルインスタンスをシリアライズする方法は?
-
[解決済み] Django South - テーブルはすでに存在する
-
[解決済み] Django-Rest-Framework のシリアライザーで Request.User を取得する方法とは?
-
[解決済み] Django REST フレームワーク: 非モデルシリアライザー
-
[解決済み] django : select_related と get_object_or_404 を一緒に使用する。
-
[解決済み] Django でモデルのフィールドを取得する
-
[解決済み] Django の {% url %} テンプレートタグでクエリパラメータを渡すことは可能でしょうか?
最新
-
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 store to databaseは現地時間より8時間短い?(2021-05-12更新)
-
ImproperlyConfiguredです。DEFAULT_INDEX_TABLESPACE の設定を要求されましたが、設定されていません。
-
ImproperlyConfiguredです。INSTALLED_APPS の設定を要求されたが、設定されていない
-
[解決済み] QuerySetで空白またはNULLの名前をフィルタリングする方法は?
-
[解決済み] Django REST Framework: ModelSerializerに追加フィールドを追加する
-
[解決済み] Djangoです。文字列からモデルを取得する?
-
[解決済み] models.pyでDjangoの設定変数を参照するには?
-
[解決済み] Djangoアプリの命名規則はありますか?
-
[解決済み] 学習に適したオープンソースのdjangoプロジェクト【非公開
-
[解決済み] Djangoのクッキー、どうすれば設定できますか?