this answerのメソッドを使用してプロファイルでユーザーモデルを拡張しようとしています。django restシリアライザで関連モデルのフィールドを変更します
私の考えは、ユーザーに関するリクエストがAPIに送信されるたびにのみ、プロファイルオブジェクトを送信することです。
次のように私はこれを達成しています
# views.py
class ProfileDetail(APIView):
"""
Retrieve or update a profile instance.
"""
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
...
def get(self, request, pk, format=None):
...
# Only allow owners to update a profile
def put(self, request, pk, format=None):
profile = self.get_object(pk)
if request.user != profile.user:
raise PermissionDenied
serializer = OwnerProfileSerializer(
profile,
data=request.data,
context={"request": request},
)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
をそして、私のシリアライザは、次のようになりますようにfirst_name
を通り、私は所有者がまたuser
オブジェクトのフィールドを変更できるようにしたいと思い
#serializers.py
# Serializer for the owner of profile object
class OwnerProfileSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.id')
first_name = serializers.ReadOnlyField(source='user.first_name')
last_name = serializers.ReadOnlyField(source='user.last_name')
email = serializers.(source='user.email')
class Meta:
model = Profile
fields = (
'url',
'id',
'dob',
'bio',
'town',
'gender',
'image',
'user',
'first_name',
'last_name',
'email',
)
、last_name
、email
、など私は(例えば)発見していないが
DRFシリアライザドキュメントの
これをどのように達成できますか?可能であれば、すべての変更をプロファイルビュー/シリアライザで行い、ユーザーではないようにします。私はlast_name = serializers.CharField(source='user.last_name')
でReadOnlyField
を置き換え試験として
--EDIT--
。私はそれを更新しようとしたとき、DRFは私に、このエラーが発生しました:
The
.update()
method does not support writable dotted-source fields by default. Write an explicit.update()
method for serializerprofiles.serializers.OwnerProfileSerializer
, or setread_only=True
on dotted-source serializer fields.
私は自分update
メソッドを実装することができようなので、それが見えます。しかし、私はどのように進むのか分からない。
私はカスタムユーザモデルを使用していないので、私は 'CustomUserSerializer'を作成して、 'profiles.serializers'? – sonarforte
はい、そこにある嘘つきを覚えておくと良いコード構造を保つとすぐに問題ありません –