注:私はdjangorestフレームワークを初めて使用します。それを使った最初のプロジェクト。私のモデルには外部キーがあり、シリアライザーでSlugRelatedFieldによってリンクします。この関連モデルは、選択できるオプションの小さなリストですが、選択できるものはユーザー(またはより具体的にはユーザーグループ)によって異なります。
ユーザーをセリライザーに入れる方法を説明するこの質問を見つけました。しかし、フィールド定義は静的であるため、これは役に立たないようですよね?
私が持っている無関係な部分を取り除く:
class MyModelSerializer(serializers.ModelSerializer):
sequence = serializers.SlugRelatedField(
many=False,
read_only=False,
slug_field='prefix',
queryset=Sequence.objects.filter(active=True,
sequence_groups__sequence_group_id__in=SequenceGroup.objects.filter(users=serializers.CurrentUserDefault()))
)
このクエリは、通常の形式でも使用するので機能します。開発を開始したとき。サーバー例外が発生します:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'CurrentUserDefault'
だから私の質問は、どうすれば現在のユーザーをSlugRelatedFieldのクエリセットに入れることができますか?
何時間も試した後、質問を書き留めることで解決策が得られるのはおかしいです。
ModelViewSetの滅菌器コンテキストにリクエストを追加します
以下のメソッドをModelViewSetに追加するだけです。
def get_serializer_context(self):
return {"request": self.request}
SerializerのコンストラクターでSlugRelatedFieldのクエリセットを調整します
def __init__(self, *args, **kwargs):
super(MyModelSerializer, self).__init__(*args, **kwargs)
# superuser can choose from all sequences, normal users can only choose from
# active sequences he is assigned to
request = self.context.get("request")
if request and hasattr(request, "user"):
sequence = self.fields['sequence']
if request.user.is_superuser:
sequence.queryset = Sequence.objects.all()
else:
sequence.queryset = Sequence.objects.filter(active=True,
sequence_groups__sequence_group_id__in=SequenceGroup.objects.filter(users=request.user))
私の場合、管理者は利用可能なオプションのいずれかを選択できるはずなので、追加の条件があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加