过滤细节导致django休息框架

时间:2014-12-16 10:10:34

标签: django django-rest-framework

我有以下型号

class CustomUser(AbstractBaseUser, PersmissionsMixin):
    #custom fields 
    practice = models.ForeignKey(Practice)

class Customer(models.Model):
    #fields
    practice = models.ForeignKey(Practice)

class Peri(models.Model):
    customer = models.ForeignKey(Customer)

我还想为Peri模型创建一个api,但我想将结果限制为与peri所属的客户属于同一做法的经过身份验证的用户。因此,在为PeriModel创建序列化程序后,我为它创建了我的ModelViewSet,就像这样

class PeriViewSet(ModelViewSet):
    #serializer_class etc

    def get_queryset(self):
        user = self.request.user
        practice = user.practice
        return Peri.objects.filter(customer__practice=practice)

上述代码将仅返回属于与登录用户具有相同做法的客户的那些属性。所以像这样:

http://example.com/api/peri/

将返回上面过滤的查询集。但详细视图怎么样。 ModelViewSet的详细信息视图是否重新评估查询集?或者它是否使用get_queryset计算的预先存在的查询集?

我的意思是如果我的查询集包含id为[2,5,6,7]且用户试图访问以下网址的模型

http://example.com/api/peri/9/ 

他会得到任何结果,假设具有id 9的peri没有记录在用户中的相同做法吗?过滤ListView查询集是否也适用于DetailView?会不会更好如果我在自定义通用过滤部分下使用此方法here

1 个答案:

答案 0 :(得分:2)

在generics.py模块中查看django-rest-framework(https://github.com/tomchristie/django-rest-framework)的源代码:

def get_object(self):
        """
        Returns the object the view is displaying.
        You may want to override this if you need to provide non-standard
        queryset lookups.  Eg if objects are referenced using multiple
        keyword arguments in the url conf.
        """
        queryset = self.filter_queryset(self.get_queryset())
        [...]

因此,get_object使用get_queryset来检索对象。因此,过滤get_queryset就足够了。

我必须注意到django-rest-framework是一个非常好的框架,但我总是需要检查最终的真相(源代码)以找到诸如你的问题的答案