@Unknown672

Как Создать профиль для юзера DRF?

Есть модель Profile

class Profile(models.Model):
    user = models.OneToOneField(User, verbose_name="Пользователь", related_name="profile", on_delete=models.CASCADE)
    name = models.CharField("Имя", max_length=30)
    surname = models.CharField("Фамилия", max_length=30)
    patronymic = models.CharField("Отчество", max_length=30)
    kind = models.CharField("Клиент или специалист", max_length=20, choices=KIND_CHOICES)
    regions = models.CharField("Регионы", max_length=100)
    phone = models.CharField("Телефон", max_length=15)


Профиль создаётся изначально как только создан юзер (т.е user уже связан с этим профилем, но профиль пустой) (сигнал)
Мне нужно принять POST запрос и **наполнить** пустой профиль

Сделал сериализатор вот таким:

class ProfileSerializer(serializers.ModelSerializer):
    user = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = Profile
        fields = [
            'user', 'name', 'surname', 
            'patronymic', 'kind', 'regions', 
            'phone', 'company', 'categories'
        ]


views:

class ProfileCreate(generics.GenericAPIView):
    # Наполнение профиля юзера

    serializer_class = ProfileSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

    def post(self, request, *args, **kwargs):
        user = get_object_or_404(User, pk=request.user.pk)
        serializer = self.get_serializer(data=request.data)
        
        if serializer.is_valid():
            user.profile = serializer.save()
            return Response(ProfileSerializer(user.profile))
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


Вылетает ошибка:
IntegrityError at /api/profile/create/
NOT NULL constraint failed: app_profile.user_id

Помогите решить данную проблему.
  • Вопрос задан
  • 826 просмотров
Пригласить эксперта
Ответы на вопрос 1
@MAGistr_MTM
Учусь программировать
Вам нужно в сериалайзер передать профиль как инстанс, и тогда его сохранять.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы