Невозможно получить текущего пользователя в сериализаторе django rest
Я не могу получить текущего пользователя в сериализаторе. Я передал контекст, но все равно получаю ошибку типа
"user": [
"This field is required."
]
#Serializer.py
class AddressSerializer(ModelSerializer):
class Meta:
model = Address
fields = "__all__"
def create(self, validated_data):
request = self.context["request"]
validated_data["user"] = request.user
return super().create(validated_data)
#Views.py
class AddAddress(APIView):
permission_classes = [IsAuthenticated]
def post(self, request):
print(request.user)
serializer = AddressSerializer(data=request.data, context={"request":request})
if serializer.is_valid():
serializer.save()
return Response(serializer.data, 200)
return Response(serializer.errors)
#Models.py
class Address(models.Model):
user = models.ForeignKey(Account, on_delete=models.CASCADE)
full_name = models.CharField(max_length=35)
email = models.EmailField(max_length=100)
phone = models.BigIntegerField()
address_line_1 = models.TextField(max_length=500)
address_line_2 = models.TextField(max_length=500)
zip_code = models.IntegerField()
city = models.CharField(max_length=20)
state = models.CharField(max_length=15)
country = models.CharField(max_length=15)
class Meta:
verbose_name_plural = "Address"
def __str__(self):
return self.full_name
Я точно не знаю, какая проблема стоит за этим
Вы можете сделать это с помощью метода save()
class AddAddress(APIView):
permission_classes = [IsAuthenticated]
def post(self, request):
print(request.user)
serializer = AddressSerializer(data=request.data, context={"request":request})
if serializer.is_valid():
serializer.save(user=request.user)
return Response(serializer.data, 200)
return Response(serializer.errors)
Попробуйте это:
request = self.context.get('request', None)
вместо этого request = self.context["request"]
Поскольку user
требуется в сериализаторе, это означает, что user
данные должны быть отправлены при пост-запросе.
Из вашего кода следует, что вы хотите добавить адрес в соответствии с пользователем, который вошел в систему. Таким образом, user
не нужно отправлять на фронтенд. Попробуйте сделать следующее:
class AddressSerializer(ModelSerializer):
class Meta:
model = Address
fields = "__all__"
extra_kwargs = {
"user": {"read_only": True}
}
def validate(self, attrs):
# make sure that you have passed request in context serializer
attrs["user"] = self.context["request"].user
return attrs
Это внешний ключ. Вам нужно присвоить ему id, а не всего пользователя. validated_data["user"] = request.user.id
Event hen если ошибка сохраняется, то проблема, похоже, в том, что в ваших validated_data нет поля "user". Проблема в данных, которые вы отправляете в запросе к сериализатору. Если они не соответствуют требуемым полям, то подтвержденные данные будут пустыми. Распечатайте и проверьте ваши проверенные данные, а также данные запроса.