我有以下型号
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
答案 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是一个非常好的框架,但我总是需要检查最终的真相(源代码)以找到诸如你的问题的答案