在 Django Rest Framework 中过滤 json 记录

Posted

技术标签:

【中文标题】在 Django Rest Framework 中过滤 json 记录【英文标题】:Filter json records in Django Rest Framework 【发布时间】:2020-02-20 04:46:06 【问题描述】:

我创建了一个 DRF API 端点,以便能够将一些数据抓取到我的数据库并使用 Jquery 在我的 Django 页面上显示。

我的示例数据如下所示:


    "item": "Someitem",
    "Price": 120,
    "Status": "Free"
,

    "item": "SecondItem",
    "Price": 90,
    "Status": "Taken"
,

因此,如果我从 JQuery 检索端点到此链接:http://127.0.0.1:8000/tst/,我将获取所有记录并将所有记录显示在我的网页中。但是,例如,如果我只想检索Status 字段设置为Taken 的记录怎么办?有什么方法可以编辑 DRF 请求使其指向http://127.0.0.1:8000/tst/Taken?或者相反,如果用户想要检索状态设置为Free 的所有其他人,它将指向http://127.0.0.1:8000/tst/Free?我知道我可以用 jquery 来做,但我实际上想在服务器端做。

我试过这个:

queryset = tst.objects.filter(Status="Taken")

但这里的问题是,它总是会从我的数据库中获取Taken 记录。就我而言,我想找到一种方法来有时从模板中检索Taken,并在其他时候检索Free

我对 DRF 还很陌生,所以我的设置非常基本:

views.py

class tstList(generics.ListCreateAPIView):
    queryset = tst.objects.all()
    serializer_class = tstSerializer


class tstDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = tst.objects.all()
    serializer_class = tstSerializer

url.py

path('tst/', views.tstList.as_view()),
path('tst/<int:pk>/', views.tstDetail.as_view()),

models.py

class tst(models.Model):
    item = models.CharField()
    Price = models.FloatField()
    Status = models.CharField()
   

    def save(self, *args, using=None, **kwargs):
        super(tst, self).save(*args, **kwargs)

【问题讨论】:

您的示例数据...这些数据来自模型还是您通过前端/jquery 发送它们? 它们来自我的模型。存储在我的数据库中 你运行的是什么版本? (python --versionpip --versionpip show djangopip show django-filterpip show djangorestframework)Julien 的答案适用于我在 Ubuntu 18.04 上使用 python 3.6.8、pip 19.2.3、django 2.2.6、django-filter 2.2。 0、djangorestframework 3.10.3. 它是 Python 3.6、Django 2.1.7、DRF 3.9.2、Django Filter 1.1.0 好的。问题是 Django 过滤器。我有 1.1 版本,我需要 2.0 版本。非常感谢@krubo! 【参考方案1】:

几天前我发现并观看了这个视频,我认为它对你的问题很有用,(关于模型管理器和查询集):

https://www.youtube.com/watch?v=rjUmA_pkGtw

【讨论】:

【参考方案2】:

看看DRF doc。 在你的情况下,我建议你安装django_filters,然后在你看来:

from django_filters.rest_framework import DjangoFilterBackend

class tstList(generics.ListCreateAPIView):
    queryset = tst.objects.all()
    serializer_class = tstSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ('Status',)

【讨论】:

嘿!感谢您的回答。好的,我可以把它放在我的视图中,但是我如何从这里过滤呢?我的意思是,我如何选择我想要的“状态”?我的意思是“免费”或“采取” 您可以从可浏览的 API 中获取示例,但在 URL 末尾添加“?Status=Free”应该可以。 试过了,我收到这个错误:无法从'django.db.models.sql.constants'导入名称'QUERY_TERMS' 我认为应该是与 Django 2.0 的兼容性问题 你使用哪个 django 版本?【参考方案3】:

您可以通过django filter设置查询集

queryset = tst.objects.filter(Status="Taken") # make sure the "Taken" is always Capitalized.

【讨论】:

是的,该解决方案有效。但这样一来,它总是将记录设置为“已记录”。但是,例如,如果我想从我的模板中调用所有 Status 设置为 free 的记录呢? tst.objects.filter(Status="Free") 我需要将这两行都添加到我的视图中吗?稍后我应该连接到哪个网址?

以上是关于在 Django Rest Framework 中过滤 json 记录的主要内容,如果未能解决你的问题,请参考以下文章

django使用rest_framework

Django Rest Framework

Django rest framework 身份和权限验证

Django Rest Framework:非模型服务

django-rest-framework - 在可浏览的 API 中自动生成表单?

在 django-rest-framework 中,是不是可以同时使用 oauth 和 session 身份验证?