[解決済み] ChoiceFieldを使ったDjangoのRestフレームワーク
2022-10-17 19:01:08
質問
私はユーザーモデルに選択フィールドをいくつか持っており、Django Rest Framework にそれを実装する最善の方法を見つけようとしています。
以下は、私がやっていることを示すためのいくつかの簡略化されたコードです。
# models.py
class User(AbstractUser):
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
# serializers.py
class UserSerializer(serializers.ModelSerializer):
gender = serializers.CharField(source='get_gender_display')
class Meta:
model = User
# viewsets.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
基本的に私がやろうとしていることは、get/post/putメソッドにコードの代わりに選択肢フィールドの表示値を使わせることで、以下のようなJSONになります。
{
'username': 'newtestuser',
'email': '[email protected]',
'first_name': 'first',
'last_name': 'last',
'gender': 'Male'
// instead of 'gender': 'M'
}
どうすればいいのでしょうか?上記のコードは動作しません。以前は、GETではこのようなものが動作していましたが、POST/PUTではエラーが発生しました。私はこれを行う方法についての一般的なアドバイスを探しています、それは一般的なもののように思えるが、私は例を見つけることができません。または私が何かひどく間違ったことをしているかのどちらかです。
どのように解決するのですか?
このスレッドの更新情報として、DRFの最新バージョンでは、実際に ChoiceField .
というわけで、もしあなたが
display_name
を返したいのであれば、サブクラス
ChoiceField
to_representation
というメソッドを作ることです。
from django.contrib.auth import get_user_model
from rest_framework import serializers
User = get_user_model()
class ChoiceField(serializers.ChoiceField):
def to_representation(self, obj):
if obj == '' and self.allow_blank:
return obj
return self._choices[obj]
def to_internal_value(self, data):
# To support inserts with the value
if data == '' and self.allow_blank:
return ''
for key, val in self._choices.items():
if val == data:
return key
self.fail('invalid_choice', input=data)
class UserSerializer(serializers.ModelSerializer):
gender = ChoiceField(choices=User.GENDER_CHOICES)
class Meta:
model = User
なので
__init__
メソッドを変更したり、追加のパッケージを追加する必要はありません。
関連
-
6.5、Django - モデルでJSONFieldを使用してJSONフィールドでMySQLテーブルを作成する
-
Django の ForeignKey パラメータの使用法
-
Djangoキャッシュの説明
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み] [Solved] カスタムDjango manage.pyコマンドをテストドライバから直接呼び出すにはどうしたらいいですか?
-
[解決済み] Django restフレームワーク、同じModelViewSetで異なるシリアライザーを使用する。
-
[解決済み] DjangoとReactJSを連携させる方法とは?
-
[解決済み] Django は静的ファイルの URL をビューで取得します。
-
[解決済み] Django でモデルのフィールドを取得する
-
[解決済み] 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 store to databaseは現地時間より8時間短い?(2021-05-12更新)
-
Django QuerySet マルチテーブル結合/条件付きピッキング/マージ
-
Djangoキャッシュの説明
-
[解決済み] (13: Permission denied) 上流:[nginx]に接続中。
-
[解決済み] Django-Rest-Framework のシリアライザーで Request.User を取得する方法とは?
-
[解決済み] Django ManyToMany filter()
-
[解決済み] Django テンプレート url タグに url パラメータを追加する方法は?
-
[解決済み] django のテンプレートで最初の文字を大文字にする
-
[解決済み] DjangoでSELECT COUNT(*) GROUP BYとORDER BYを行うにはどうすればよいですか?
-
[解決済み] Django の DoesNotExist 例外はどのようにインポートしますか?