Django User Profile Extension

0

Cześć,
mam pewien problem z rozszerzeniem profilu użytkownika w moim api.
Przeszukałem trochę sieci, nie znalazłem jednak satysfakcjonującego mnie rozwiązania, dlatego piszę tutaj.

Tworzę sobie model Profilu użytkownika:

class UserProfile(models.Model):
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
    test_field = models.CharField(max_length=640, blank=True)

    def __str__(self):
        return self.user.username

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        profile, created = UserProfile.objects.get_or_create(user=instance)

post_save.connect(create_user_profile, sender=get_user_model())

views.py

class UserProfileViewSet(viewsets.ModelViewSet):

    serializer_class = UserProfileSerializer
    permission_classes = (IsAuthenticated,)  # (IsAuthenticated, IsAdminOrReadOnly)  # todo !!!!!!!!!

    # to get data only for current user.
    def get_queryset(self):
        return UserProfile.objects.filter(user=self.request.user)

serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = '__all__'

Podczas tworzenia nowego użytkownika tworzy mi się od razu profil tego użytkownika. Jednak bez uzupełnionych pól UserProfile.

Problem w tym, że nie bardzo wiem, jak wówczas podczas rejestracji jednocześnie przekazać pola modelu UserProfile.

W tej chwili używając Postmana w body wpisuję jedynie username, password oraz password1. (a chciałbym móc wpisać też pola modelu UserProfile) W zamian otrzymuję Token, zarejestrowanego Usera oraz przypisany mu UserProfil- bez wpisanych wartości pól UserProfile. (w powyższym przykładzie test_field)
Jak to ugryźć?

Pomyślałem, że ewentualnie wystarczy, że po rejestracji użytkownika - zalogowany użytkownik uzupełni tylko pola UserProfile (w sensie zamiast robienia tego podczas rejestracji)
Uzupełnienie pól UserProfile zarejestrowanego wcześniej użytkownika - z panelu administracyjnego django - działa bez problemu. Z Postmana - niestety mam problem.
W sensie, wysyłałem na endpoint http://localhost:8000/auth/login/ login i hasło, otrzymałem Token, następnie używając tego tokena wysyłałem POST z postmana i otrzymuję błąd jak poniżej:
screenshot-20200917213510.png

Wyżej pokazany błąd to tylko przykład, oczywiście wiem, że wpisane tam dane nie są właściwe.

Ogółem zależy mi, żeby zrobić to możliwie w prosty i bezpieczny sposób - uczę się trochę django, trochę react i na ogół chodzi o to, żeby potem wykorzystać taką funkcjonalność w frontendzie zbudowanym w React.

Przy okazji - czy dokumentacja django/drf będzie najlepszym wyborem podczas nauki i próby budowania aplikacji od podstaw? A może polecacie coś innego?

1

Do user serializera możesz dodać UserProfileSerializer jako field i wtedy powinien przyjmować dane do niego.

0

No okej, tak zrobiłem, pozwoli to z api tworzyć usera z polem profile - właśnie o to mi chodziło.
A więc stworzyłem Serializer dla Usera:

from django.contrib.auth import get_user_model
class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer(required=True)

    class Meta:
        model = get_user_model()
        fields = '__all__'

    def create(self, validated_data):

        profile = ProfileSerializer.create(ProfileSerializer(), validated_data)
        user, created = get_user_model().objects.create(profile=profile)
        return user

Jak w takim przypadku przekazać usera którego właśnie rejestruję do pola user w userprofile?
Rozumiem, że powinienem zająć się tym z poziomu serializatora?

Poniżej tylko dla informacji pokazuję błędy które otrzymuję podczas tworzenia usera z profilem jako field. (takie same jak poprzednio podczas tworzenia wyłącznie profilu)

screenshot-20200920210803.png

screenshot-20200920210835.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1