【发布时间】:2020-09-16 11:58:26
【问题描述】:
我有这个获取视图,我想检查 IsOwner 权限。
权限类
class IsOwnerVendor(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
print(f"Vendor Email:{obj.vendor_id.email}")
print(f"Loggon user:{obj.vendor_id.email}" )
return obj.vendor_id.email == request.user
这是我的对象模型
class Menu(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(max_length=500)
price = models.FloatField()
quantity = models.IntegerField(default=1)
menu_cat = models.CharField(choices=MENU_CAT, max_length=5)
date_created = models.DateTimeField(auto_now_add=True)
last_edited = models.DateTimeField(auto_now=True)
vendor_id = models.ForeignKey(Vendor, on_delete=models.CASCADE)
is_recurring = models.BooleanField(default=False)
recurring_freq = models.IntegerField(default=1)
供应商模型
class Vendor(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
business_name = models.CharField(max_length=100)
email = models.EmailField()
phone_number = PhoneField(help_text='Vendor phone number')
registered_on = models.DateTimeField(auto_now_add=True)
last_updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.business_name
这是我的观点
class MenuDetailView(generics.GenericAPIView):
permission_classes = [IsOwnerVendor | IsOwnerVendor]
def get_serializer_class(self):
if self.request.method == 'PUT':
return MenuUpdateSerializer
elif self.request.method == 'GET':
return MenuListSerializer
else:
return MenuListSerializer
def get_object(self, pk):
try:
obj = Menu.objects.get(pk=pk, )
self.check_object_permissions(self.request, obj)
return obj
except Menu.DoesNotExist:
raise Http404
@method_permission_classes((IsOwnerVendor,))
def get(self, request, pk, format=None):
my_menu = self.get_object(pk=pk)
menu_serializer = MenuListSerializer(my_menu)
return Response(menu_serializer.data, status=status.HTTP_200_OK)
当我尝试访问视图时,我总是收到以下错误
{
"detail": "You do not have permission to perform this action."
}
我已阅读 DRF 文档,但仍无法确定问题所在。
【问题讨论】:
-
请发布模型供应商详细信息。
-
试试
return obj.vendor_id.email == request.user.email? -
@Ykh,我已编辑添加供应商模型。我也厌倦了你的方法。我仍然得到相同的结果。
-
试试
return obj.vendor_id.user == request.user -
@Ykh,我刚刚使用 return obj.vendor_id.email == request.user.email 重试,现在它正在工作。我会打赌我试过了。我花了几个小时试图找出确切的问题。谢谢哥们。尊重。你能作为答案回复我接受吗?
标签: django django-rest-framework permissions