Możesz pisać i PUT z @kahlo's approach jeśli również przesłonić metody tworzenia i aktualizacji na swojej serializatora.
Biorąc pod uwagę model profil tak:
class Profile(models.Model):
user = models.OneToOneField(User)
avatar_url = models.URLField(default='', blank=True) # e.g.
Oto serializer użytkownika, zarówno odczytuje i zapisuje pole dodatkowy profil (s):
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)
Powstały API prezentuje płaską zasób użytkownika , zgodnie z życzeniem:
GET /users/5/
{
"url": "http://localhost:9090/users/5/",
"username": "test",
"avatar_url": "http://example.com/avatar.jpg"
}
i można dołączyć profil avatar_url
pole w żądaniach POST i PUT. (I usuwać na zasobie użytkownika będzie również usunąć swój model Profile, choć to po prostu normalne usuwania kaskadowego Django).
Logika tutaj będzie zawsze stworzenie modelu profil użytkownika, jeśli brakuje (po każdej aktualizacji). Z użytkownikami i profilami prawdopodobnie to właśnie chcesz. W przypadku innych relacji może nie być, i będziesz musiał zmienić logikę aktualizacji lub tworzenia. (Dlatego dla ciebie jest to DRF doesn't automatically write through a nested relationship).
Sprawdź [odpowiedzi na to pytanie] [1]. Myślę, że obejmuje to, czego potrzebujesz. [1]: http: // stackoverflow.com/questions/18012665 / how-can-one-customize-django-rest-framework-serializers-output/ –
Ta odpowiedź jest również przydatna: http://stackoverflow.com/a/19806796/2789332 – Avril
Pamiętaj, aby zaakceptować, jeśli jak odpowiedź poniżej! – bbengfort