【问题标题】:filtering detail results in django rest framework在 django rest 框架中过滤细节结果
【发布时间】:2015-02-14 14:45:54
【问题描述】:

我有以下型号

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)

上面的代码将只返回那些属于与登录用户有相同做法的客户的 peri。所以是这样的:

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会更好吗??

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    def get_object(self): """ 返回视图正在显示的对象。 如果您需要提供非标准,您可能需要覆盖它 查询集查找。例如,如果使用多个引用对象 url conf 中的关键字参数。 """ 查询集 = self.filter_queryset(self.get_queryset()) [...]

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-24
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2023-03-13
      • 2014-02-17
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多