REST Django - 无法从我的验证器中找到请求的上下文
REST Django - Can't find context of request from within my validator
请温柔点。我是 Django 新手,我发现抽象级别简直令人难以抗拒。
我的最终目标是修改进入模型的图像文件。该部分可能相关也可能不相关,但我在 post 中得到了帮助,它建议我应该在验证器内部进行更改:
无论如何,目前我只是想获取请求的上下文,这样我就可以确保仅在请求为 POST 时才对事物执行操作。但是,在我的验证器中,self.context 只是一个空字典。根据我在那里发现的内容,self.context['request'] 应该有一个值。
这是我拥有的:
带有验证器方法的序列化器:
class MediaSerializer(serializers.ModelSerializer):
class Meta:
model = Media
fields = '__all__'
def validate_media(self, data):
print(self.context)
#todo: why is self.context empty?
#if self.context['request'].method == 'POST':
# print('do a thing here')
return data
def to_representation(self, instance):
data = super(MediaSerializer, self).to_representation(instance)
return data
视图以及 post 方法
class MediaView(APIView):
queryset = Media.objects.all()
parser_classes = (MultiPartParser, FormParser)
permission_classes = [permissions.IsAuthenticated, ]
serializer_class = MediaSerializer
def post(self, request, *args, **kwargs):
user = self.request.user
print(user.username)
request.data.update({"username": user.username})
media_serializer = MediaSerializer(data=request.data)
# media_serializer.update('username', user.username)
if media_serializer .is_valid():
media_serializer.save()
return Response(media_serializer.data, status=status.HTTP_201_CREATED)
else:
print('error', media_serializer.errors)
return Response(media_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
模特:
class Media(models.Model):
objects = None
username = models.ForeignKey(User, to_field='username',
related_name="Upload_username",
on_delete=models.DO_NOTHING)
date = models.DateTimeField(auto_now_add=True)
#temp_media = models.FileField(upload_to='upload_temp', null=True)
media = models.FileField(upload_to='albumMedia', null=True)
#todo: potentially this will go to a temp folder, optimize will be called and then permananent home will be used -jjb
#MEDIA_ROOT path must be /src/upload
file_type = models.CharField(max_length=12)
MEDIA_TYPES = (
('I', "Image"),
('V', "Video")
)
media_type = models.CharField(max_length=1, choices=MEDIA_TYPES, default='I')
ACCESSIBILITY = (
('P', "Public"),
('T', "Tribe"),
('F', "Flagged")
)
user_access = models.CharField(max_length=1, choices=ACCESSIBILITY, default='P')
所以我只是想弄清楚如何解决这个上下文问题。另外,如果有关于如何到达我要去的地方的任何其他提示,我将不胜感激。
PS 我是新来的。如果我以不适合堆栈溢出的方式写了这个问题,请善待,我会更正它。谢谢
我认为您不必担心在 validate_media()
方法中检查请求是否为 POST。通常只在 POST、PATCH 和 PUT 请求期间进行验证。最重要的是,验证仅在您在序列化程序上调用 is_valid()
时发生,通常在视图中显式调用,就像您在 post()
函数中所做的那样。只要你从不从 post()
以外的任何地方调用 is_valid()
,你就知道它是 POST。由于您不支持 patch()
或 put()
,因此这应该不是问题。
inside my validator, the self.context is just an empty dictionary
您必须在创建序列化程序时显式传入上下文才能使其存在。这里没有魔法。正如您在 the source code 中看到的那样,当您不传入时,context
默认为 {}
。
要传递上下文,您可以这样做:
context = {'request': request}
media_serializer = MediaSerializer(data=request.data, context=context)
更好的是,传入方法即可:
context = {'method': request.method}
media_serializer = MediaSerializer(data=request.data, context=context)
您可以根据需要制作 context
词典。
请温柔点。我是 Django 新手,我发现抽象级别简直令人难以抗拒。
我的最终目标是修改进入模型的图像文件。该部分可能相关也可能不相关,但我在 post 中得到了帮助,它建议我应该在验证器内部进行更改:
无论如何,目前我只是想获取请求的上下文,这样我就可以确保仅在请求为 POST 时才对事物执行操作。但是,在我的验证器中,self.context 只是一个空字典。根据我在那里发现的内容,self.context['request'] 应该有一个值。 这是我拥有的:
带有验证器方法的序列化器:
class MediaSerializer(serializers.ModelSerializer):
class Meta:
model = Media
fields = '__all__'
def validate_media(self, data):
print(self.context)
#todo: why is self.context empty?
#if self.context['request'].method == 'POST':
# print('do a thing here')
return data
def to_representation(self, instance):
data = super(MediaSerializer, self).to_representation(instance)
return data
视图以及 post 方法
class MediaView(APIView):
queryset = Media.objects.all()
parser_classes = (MultiPartParser, FormParser)
permission_classes = [permissions.IsAuthenticated, ]
serializer_class = MediaSerializer
def post(self, request, *args, **kwargs):
user = self.request.user
print(user.username)
request.data.update({"username": user.username})
media_serializer = MediaSerializer(data=request.data)
# media_serializer.update('username', user.username)
if media_serializer .is_valid():
media_serializer.save()
return Response(media_serializer.data, status=status.HTTP_201_CREATED)
else:
print('error', media_serializer.errors)
return Response(media_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
模特:
class Media(models.Model):
objects = None
username = models.ForeignKey(User, to_field='username',
related_name="Upload_username",
on_delete=models.DO_NOTHING)
date = models.DateTimeField(auto_now_add=True)
#temp_media = models.FileField(upload_to='upload_temp', null=True)
media = models.FileField(upload_to='albumMedia', null=True)
#todo: potentially this will go to a temp folder, optimize will be called and then permananent home will be used -jjb
#MEDIA_ROOT path must be /src/upload
file_type = models.CharField(max_length=12)
MEDIA_TYPES = (
('I', "Image"),
('V', "Video")
)
media_type = models.CharField(max_length=1, choices=MEDIA_TYPES, default='I')
ACCESSIBILITY = (
('P', "Public"),
('T', "Tribe"),
('F', "Flagged")
)
user_access = models.CharField(max_length=1, choices=ACCESSIBILITY, default='P')
所以我只是想弄清楚如何解决这个上下文问题。另外,如果有关于如何到达我要去的地方的任何其他提示,我将不胜感激。
PS 我是新来的。如果我以不适合堆栈溢出的方式写了这个问题,请善待,我会更正它。谢谢
我认为您不必担心在 validate_media()
方法中检查请求是否为 POST。通常只在 POST、PATCH 和 PUT 请求期间进行验证。最重要的是,验证仅在您在序列化程序上调用 is_valid()
时发生,通常在视图中显式调用,就像您在 post()
函数中所做的那样。只要你从不从 post()
以外的任何地方调用 is_valid()
,你就知道它是 POST。由于您不支持 patch()
或 put()
,因此这应该不是问题。
inside my validator, the self.context is just an empty dictionary
您必须在创建序列化程序时显式传入上下文才能使其存在。这里没有魔法。正如您在 the source code 中看到的那样,当您不传入时,context
默认为 {}
。
要传递上下文,您可以这样做:
context = {'request': request}
media_serializer = MediaSerializer(data=request.data, context=context)
更好的是,传入方法即可:
context = {'method': request.method}
media_serializer = MediaSerializer(data=request.data, context=context)
您可以根据需要制作 context
词典。