シリアライザーのcreate メソッドと update メソッドもオーバーライドすると、 @kahlo のアプローチで POST と PUT を実行できます。
次のようなプロファイル モデルがあるとします。
class Profile(models.Model):
user = models.OneToOneField(User)
avatar_url = models.URLField(default='', blank=True) # e.g.
追加のプロファイル フィールドの読み取りと書き込みの両方を行うユーザー シリアライザーを次に示します。
class UserSerializer(serializers.HyperlinkedModelSerializer):
# A field from the user's profile:
avatar_url = serializers.URLField(source='profile.avatar_url', allow_blank=True)
class Meta:
model = User
fields = ('url', 'username', 'avatar_url')
def create(self, validated_data):
profile_data = validated_data.pop('profile', None)
user = super(UserSerializer, self).create(validated_data)
self.update_or_create_profile(user, profile_data)
return user
def update(self, instance, validated_data):
profile_data = validated_data.pop('profile', None)
self.update_or_create_profile(instance, profile_data)
return super(UserSerializer, self).update(instance, validated_data)
def update_or_create_profile(self, user, profile_data):
# This always creates a Profile if the User is missing one;
# change the logic here if that's not right for your app
Profile.objects.update_or_create(user=user, defaults=profile_data)
結果の API は、必要に応じてフラットなユーザー リソースを提供します。
GET /users/5/
{
"url": "http://localhost:9090/users/5/",
"username": "test",
"avatar_url": "http://example.com/avatar.jpg"
}
avatar_url
また、プロファイルのフィールドを POST 要求と PUT 要求の両方に含めることができます。(そして、ユーザー リソースの DELETE は、プロファイル モデルも削除しますが、これは Django の通常の削除カスケードにすぎません。)
ここでのロジックは、ユーザーのプロファイル モデルが欠落している場合 (更新時に)常に作成します。ユーザーとプロファイルを使用すると、おそらくそれが必要になります。他の関係についてはそうではない可能性があり、更新または作成ロジックを変更する必要があります。(これが、DRFがネストされたリレーションシップを介して自動的に書き込まない理由です。)