Django Rest Framework - Как установить current_user при POST - PullRequest
1 голос
/ 26 октября 2019

Я только что выполнил небольшое руководство по использованию DRF, но не могу понять, как понравиться моей модели его пользователю при размещении нового объекта

это моя модель:

# Create your models here.
class Project(models.Model):
  # project title
  title = models.CharField(max_length=255, null=False)
  # subtitle
  subtitle = models.CharField(max_length=255, null=False)

  #######

  user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)

и так мой serializer


class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ("id", "title", "subtitle", "user_id")

так, теперь в view у меня есть доступ к current_user с этим: request.user


class ListProjectsView(generics.ListCreateAPIView):

    authentication_classes = [authentication.TokenAuthentication]

    queryset = Project.objects.all()
    serializer_class = ProjectSerializer

    def list(self, request):
        queryset = Project.objects.filter(user_id=request.user.id)
        serializer = ProjectSerializer(queryset, many=True)
        return Response(serializer.data)

[...]

    def create(self, request, pk = None):
      return super(ListProjectsView, self).create(request, pk = None)


Я полагаю, что естьспособ передать request.user - это создание, чтобы можно было заполнить мой Project.user_id?

Что бы я ни делал, мне не удается настроить пользователя, и я получаю django.db.utils.IntegrityError: null value in column "user_id" violates not-null constraint ошибка

Есть идеи?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Попробуйте переопределить с помощью следующего метода. Каждый раз, когда выполняется операция PUT / PATCH / CREATE, вызывается следующий метод. Это хороший способ передать текущего пользователя.

   def perform_create(self, serializer):
        serializer.save(user = self.request.user)
0 голосов
/ 26 октября 2019
class Project(models.Model):
  # project title
  title = models.CharField(max_length=255, null=False)
  # subtitle
  subtitle = models.CharField(max_length=255, null=False)
  user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)

ладно, у вас есть пользователь FK, но попробуйте получить к нему доступ user_id = request.user.id

Просто позвоните

queryset = Project.objects.filter(user=request.user)

queryset = Project.objects.filter (user_id = request.user.id)

если вы хотите сопоставить идентификатор, вы должны поставить два __ примерно так user__id = request.user.id, но я не вижу никакого смысла в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...