2016-01-03 28 views
0

我有一个模型DRF - 限制对象返回给业主

class Widget(models.Model): 
    title = models.CharField(max_length=100) 
    description = models.CharField(max_length=1024) 
    username = models.CharField(max_length=50) 
    code = models.CharField(max_length=1024) 
    owner = models.ForeignKey('MyappUser', related_name='Myapp_owner') 
    list = models.ForeignKey('WidgetList') 

我希望能够做到调用特定视图时,什么 -

class WidgetList(generics.ListCreateAPIView): 
    queryset = Widget.objects.all() 
    serializer_class = WidgetSerializer 
    filter_class = WidgetFilter 

我只是想拥有的小工具。用户登录

我现在的过滤器 -

class WidgetFilter(django_filters.FilterSet): 
    owner = django_filters.NumberFilter(name="owner", lookup_type="exact") 
    list = django_filters.NumberFilter(name="list", lookup_type="exact") 

    class Meta: 
     model = Widget 
     fields = ['owner', 'list'] 

现在我必须做/api/widgets/?owner=3&list=5

但是这并不妨碍另一个用户查看小部件。

我以前一直用做以下,但它打破了我做一个过滤器类的能力 -

class WidgetList(generics.ListCreateAPIView): 
    queryset = Widget.objects.all() 
    serializer_class = WidgetSerializer 


    def get(self, request): 
     if request.user: 
      queryset = self.get_queryset().filter(owner=request.user) 
      for object in queryset: 
       object.code = decrypt_code(masterkey, 
                personalkey, 
                object.code) 
     else: 
      queryset = self.get_queryset() 

     page = self.paginate_queryset(queryset) 
     if page is not None: 
      serializer = self.get_serializer(page, many=True) 
      return self.get_paginated_response(serializer.data) 

     serializer = WidgetSerializer(queryset, many=True) 
     return Response(serializer.data) 

我希望能够做的是,如果我有这样一个名单 -

Jane 
Widget 1 
Widget List ABC 

Jane 
Widget 2 
Widget List DEF (which is 3) 

Mike (which is 3) 
Widget 3 
Widget List ABC (which is 5) 

Alfred 
Widget 4 
Widget List ABC 

如果我这样做/api/widgets/?list=5如果我登录的迈克,我只希望看到的Widget 3

+0

重写'get_queryset'并保留filter_class。 – masnun

+0

解释如何?我一直在尝试15种不同的东西,但没有运气。 – whoisearth

+0

撰写详细的答案。 – masnun

回答

1

从文档:

请注意,您可以同时使用覆盖的.get_queryset()和通用 进行过滤,并且所有内容都将按预期工作。

所以我会做这样的事情:

class WidgetList(generics.ListCreateAPIView): 
    queryset = Widget.objects.all() 
    serializer_class = WidgetSerializer 
    filter_class = WidgetFilter 


    def get_queryset(self): 
     owner = self.request.user 
     return super(WidgetList, self).get_queryset().filter(owner=request.user) 

我没测试,不过代码我希望的是get_queryset只会返回由业主过滤条目。所以它不会包含来自其他用户的条目。

+0

但这就是我已经在做我的工作示例?问题是,然后试图做一个过滤器没有做任何事情。 'def get(self,request): if request.user: queryset = self.get_queryset()。filter(owner = request.user)'? – whoisearth

+0

因为你跳过'WidgetList'上的'filter_class'? – masnun

+0

我想我知道这个问题。我需要获得其他代码才能获得回报,因为它正在解密字段中的数据。你的代码工作,问题是我在哪里把'for对象放在queryset:....'需要在那里解密字段object.code? – whoisearth