Как обновить расширенный профиль пользователя в Django со ссылкой один на один? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь выяснить, как расширить модель User, используя отношение «один к одному» в Django. Я создаю профиль пользователя для хранения дополнительной информации о пользователе. Тем не менее, я новичок в Django и не понимаю, как я обновляю этот профиль пользователя.

Я хочу добавить UserProfileSerializer в файл сериализаторов для обновления профиля, как мне это сделать? И как мне вызвать это в моем файле представлений?

Ближайшая информация, которую я могу найти:

def update_profile(request, user_id):
    user = User.objects.get(pk=user_id)
    user.profile.bio = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit...'
    user.save()

Однако я не понимаю, как я могу ссылаться на user_id через мой класс сериализатора или как я могу пройти через user_id из запроса. Ниже представлен сериализатор и представления модели пользователя, а также модель профиля.

Модель профиля

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    pin = models.CharField(null=True, max_length=4, blank=True)
    birth_date = models.DateField(null=True, blank=True)
    security_question_1 = models.CharField(null=True, max_length=100, blank=True)
    security_question_2 = models.CharField(null=True, max_length=100, blank=True)
    security_question_3 = models.CharField(null=True, max_length=100, blank=True)


# post_save is the signal received when a save event occurs in the User model
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

Класс сериализатора пользователя

class UserSerializer(serializers.ModelSerializer):

    username = serializers.CharField(max_length=30,
                                     validators=[UniqueValidator(queryset=User.objects.all())]
                                     )
    password = serializers.CharField(min_length=8, write_only=True)

    def create(self, validated_data):
        first_name = serializers.CharField(max_length=30, allow_blank=False)
        last_name = serializers.CharField(max_length=30, allow_blank=False)
        user = User.objects.create_user(validated_data['username'],
                                        validated_data['username'],
                                        validated_data['password'],
                                        )
        user.first_name = validated_data['first_name']
        user.last_name = validated_data['last_name']
        user.save()

        return user

    cards = serializers.PrimaryKeyRelatedField(many=True, allow_null=True, queryset=Card.objects.all())

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'password', 'cards']

Представление пользователя

class UserCreate(APIView):
    # Creates the user
    def post(self, request, format='json'):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            if user:
                token = Token.objects.create(user=user)
                json = serializer.data
                json['token'] = token.key
                return Response(json, status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Любая помощь очень ценится, я изо всех сил. Спасибо!

...