Как привязать пользователя к почтовому запросу в Django drf - PullRequest
1 голос
/ 05 февраля 2020

У меня есть следующее:

Я работаю с DRF на основе токена JWT. Я хочу связать эксперимент с ПОЛЬЗОВАТЕЛЕМ, т. Е. При поступлении почтового запроса я хочу иметь возможность сохранить этот почтовый запрос с помощью клавиши Foregin, необходимой для автора, отправившего запрос. POST-запрос всегда аутентифицирован и никогда не анонимен, то есть request.user всегда существует (я вижу это при отладке)

Я попытался добавить следующее

def create(self, request, **kwargs):
   request.data["author"] = request.user
   serializer = ExperimentsSerializers(data=request.data)
   if serializer.is_valid():
       serializer.save()
       return....

Но is_valid return всегда False (единственный раз, когда ts был истиной, был, когда я вынул автора из полей ExperimentSerializers ....

будет рад за любые выводы ....

мой код прикрепленный ниже

Model.py :

class User(AbstractUser):
    pass

    def __str__(self):
        return self.username

class Experiments(models.Model):
    name = models.CharField(max_length=40)
    time = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

View.py :

filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
serializer_class = ExperimentsSerializers
queryset = Experiments.objects.all()
filterset_fields = '__all__'
permission_classes = (permissions.IsAuthenticated,)

сериализаторы .py

class ExperimentsSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Experiments
        fields = '__all__'

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Еще одним подходом может быть использование

HiddenField со значением по умолчанию, установленным на CurrentUserDefault

Таким образом, поле не будет экспонироваться в то же время время, когда текущий пользователь будет доступен, и с этим контекстом пользователя могут быть выполнены другие операции.

author = serializers.HiddenField (default = serializers.CurrentUserDefault ())

Что-то как это:

class ExperimentsSerializers(serializers.ModelSerializer):
    author = serializers.HiddenField(default=serializers.CurrentUserDefault())

    class Meta:
        model = models.Experiments
        fields = '__all__'

Ссылка:

2 голосов
/ 05 февраля 2020

Вы можете просто передать дополнительные данные с save аргументами:

def create(self, request, **kwargs):
   serializer = ExperimentsSerializers(data=request.data)
   if serializer.is_valid():
       serializer.save(author=request.user)

Обратите внимание, что вам может потребоваться указать поле author как read_only так что это не потребуется в теле запроса:

class ExperimentsSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Experiments
        fields = '__all__'
        read_only_fields = ['author']
...