[解決済み] Django restフレームワーク、同じModelViewSetで異なるシリアライザーを使用する。
2022-04-16 04:58:51
質問
2つの異なるシリアライザを提供したいのですが、同時に
ModelViewSet
:
-
オブジェクトのリストを表示するとき、各オブジェクトにその詳細へリダイレクトするURLを持たせ、他のすべての関連は
__unicode __
をターゲットモデルの
の例です。
{
"url": "http://127.0.0.1:8000/database/gruppi/2/",
"nome": "universitari",
"descrizione": "unitn!",
"creatore": "emilio",
"accesso": "CHI",
"membri": [
"emilio",
"michele",
"luisa",
"ivan",
"saverio"
]
}
-
オブジェクトの詳細を表示する際に、デフォルトの
HyperlinkedModelSerializer
の例です。
{
"url": "http://127.0.0.1:8000/database/gruppi/2/",
"nome": "universitari",
"descrizione": "unitn!",
"creatore": "http://127.0.0.1:8000/database/utenti/3/",
"accesso": "CHI",
"membri": [
"http://127.0.0.1:8000/database/utenti/3/",
"http://127.0.0.1:8000/database/utenti/4/",
"http://127.0.0.1:8000/database/utenti/5/",
"http://127.0.0.1:8000/database/utenti/6/",
"http://127.0.0.1:8000/database/utenti/7/"
]
}
以下の方法で、なんとかすべて思い通りに動作させることができました。
シリアライザー.py
# serializer to use when showing a list
class ListaGruppi(serializers.HyperlinkedModelSerializer):
membri = serializers.RelatedField(many = True)
creatore = serializers.RelatedField(many = False)
class Meta:
model = models.Gruppi
# serializer to use when showing the details
class DettaglioGruppi(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Gruppi
views.py
class DualSerializerViewSet(viewsets.ModelViewSet):
"""
ViewSet providing different serializers for list and detail views.
Use list_serializer and detail_serializer to provide them
"""
def list(self, *args, **kwargs):
self.serializer_class = self.list_serializer
return viewsets.ModelViewSet.list(self, *args, **kwargs)
def retrieve(self, *args, **kwargs):
self.serializer_class = self.detail_serializer
return viewsets.ModelViewSet.retrieve(self, *args, **kwargs)
class GruppiViewSet(DualSerializerViewSet):
model = models.Gruppi
list_serializer = serializers.ListaGruppi
detail_serializer = serializers.DettaglioGruppi
# etc.
基本的には、ユーザーがリストビューと詳細ビューのどちらを要求しているかを検出し、その要求に応じて
serializer_class
を自分のニーズに合わせて変更します。でも、このコードにはあまり満足していません。汚いハックのように見えますし、何より
2人のユーザーがリストと詳細を同時にリクエストした場合はどうなりますか?
を使用してこれを実現する良い方法はありますか?
ModelViewSets
を使用しなければならないのでしょうか?
GenericAPIView
?
EDITです。
カスタムベースを使ったやり方は以下の通りです。
ModelViewSet
:
class MultiSerializerViewSet(viewsets.ModelViewSet):
serializers = {
'default': None,
}
def get_serializer_class(self):
return self.serializers.get(self.action,
self.serializers['default'])
class GruppiViewSet(MultiSerializerViewSet):
model = models.Gruppi
serializers = {
'list': serializers.ListaGruppi,
'detail': serializers.DettaglioGruppi,
# etc.
}
解決方法は?
をオーバーライドして
get_serializer_class
メソッドを使用します。このメソッドは、適切なシリアライザークラスを取得するために、モデルミキシンで使用されます。
また
get_serializer
を返すメソッドです。
インスタンス
正しいシリアライザの
class DualSerializerViewSet(viewsets.ModelViewSet):
def get_serializer_class(self):
if self.action == 'list':
return serializers.ListaGruppi
if self.action == 'retrieve':
return serializers.DettaglioGruppi
return serializers.Default # I dont' know what you want for create/destroy/update.
関連
-
[解決済み】コマンド 'git' が見つからない - windows
-
[解決済み】DjangoのQuerySetをリストに変換する方法とは?
-
[解決済み] django 1.7 migrate で "table already exists" というエラーが発生する。
-
django upstream が up からの応答ヘッダを読み込む際に接続を早々に切断してしまう。
-
django 1.8 公式ドキュメントの翻訳です。13-3 ログ
-
djangoにおけるrelated_nameの役割
-
Djangoデータベースのクエリセット操作
-
[解決済み] request.FILESからファイル名を取得するにはどうすればよいですか?
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み] Django REST フレームワーク: 非モデルシリアライザー
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DISTINCT ON フィールドは、このデータベースバックエンドではサポートされていません。
-
[解決済み] POSTメソッドは常に403 Forbiddenを返します。
-
django no such table: django_session エラー解決。
-
django.core.exceptions.ImproperlyConfigured: MySQLdb モジュールの読み込みに失敗しました。
-
[解決済み] ユーザー認証の方法
-
[解決済み】Djangoのクエリ - idとpkの比較
-
[解決済み】Djangoでメールテンプレートを作成する
-
[解決済み】Djangoで一対多の関係を表現する方法は?
-
[解決済み】Django Southでの後方移行について
-
[解決済み] [Djangoで「一括更新」する方法とは?