[解決済み] Django Rest フレームワーク。フィールドのサブセットを動的に返す
2022-08-13 22:27:24
質問
問題点
ブログ記事で推奨されているように
実用的なRESTful APIを設計するためのベストプラクティス
を追加したいと思います。
fields
クエリパラメータを Django Rest Framework ベースの API に追加したいのですが、これによってユーザはリソースごとにフィールドのサブセットのみを選択することができます。
例
シリアライザーです。
class IdentitySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Identity
fields = ('id', 'url', 'type', 'data')
通常のクエリでは、すべてのフィールドが返されます。
GET /identities/
[
{
"id": 1,
"url": "http://localhost:8000/api/identities/1/",
"type": 5,
"data": "John Doe"
},
...
]
クエリに
fields
パラメータは、フィールドのサブセットのみを返すべきです。
GET /identities/?fields=id,data
[
{
"id": 1,
"data": "John Doe"
},
...
]
無効なフィールドを持つクエリは、無効なフィールドを無視するか、クライアントエラーを投げる必要があります。
目標
これはどうにかして箱から出しても可能なのでしょうか?そうでない場合、これを実装する最も簡単な方法は何でしょうか?これを行うサード パーティのパッケージはすでにあるのでしょうか?
どのように解決するのですか?
シリアライザーをオーバーライドすることができます
__init__
メソッドをオーバーライドして
fields
属性を動的に設定します。メソッドにアクセスすることができます。
request
オブジェクトにアクセスできます。
以下は、以下のコピー&ペーストです。 Django Rest Framework ドキュメントの例 を参照してください。
from rest_framework import serializers class DynamicFieldsModelSerializer(serializers.ModelSerializer): """ A ModelSerializer that takes an additional `fields` argument that controls which fields should be displayed. """ def __init__(self, *args, **kwargs): # Instantiate the superclass normally super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs) fields = self.context['request'].query_params.get('fields') if fields: fields = fields.split(',') # Drop any fields that are not specified in the `fields` argument. allowed = set(fields) existing = set(self.fields.keys()) for field_name in existing - allowed: self.fields.pop(field_name) class UserSerializer(DynamicFieldsModelSerializer, serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ('url', 'username', 'email')
関連
-
AttributeError: 'str' オブジェクトには 'decode' という属性がありません。
-
ImproperlyConfiguredです。DEFAULT_INDEX_TABLESPACE の設定を要求されましたが、設定されていません。
-
[解決済み] Django のビューで 2 つ以上のクエリセットを結合するにはどうすればよいですか?
-
[解決済み] Django で完全な/絶対的な URL (ドメイン付き) を取得するにはどうすればよいですか?
-
[解決済み] Django のクエリで OR フィルタを行うにはどうすればよいですか?
-
[解決済み] Django restフレームワーク、同じModelViewSetで異なるシリアライザーを使用する。
-
[解決済み] Django South - テーブルはすでに存在する
-
[解決済み] Django REST フレームワーク: 非モデルシリアライザー
-
[解決済み] Django Rest Frameworkを使用して、関連するモデルフィールドを含めるにはどうすればよいですか?
-
[解決済み] django-tastypie と djangorestframework の違いは何ですか?[クローズド]
最新
-
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: 属性を設定できない
-
Djangoの基本(16)。テンプレートタグの紹介とそのカスタマイズ方法
-
[解決済み] Django の管理者パスワードをリセットする方法は?
-
[解決済み] Django のカスタムフィールドで User モデルを拡張する
-
[解決済み] Django South - テーブルはすでに存在する
-
[解決済み] Django の filter と get は単一オブジェクトの場合?
-
[解決済み] Django は静的ファイルの URL をビューで取得します。
-
[解決済み] django : select_related と get_object_or_404 を一緒に使用する。
-
[解決済み] Django: Django のアプリを完全にアンインストールするには?
-
[解決済み] DjangoでSELECT COUNT(*) GROUP BYとORDER BYを行うにはどうすればよいですか?