社区首页 >问答首页 >如何将django rest过滤与mongoengine一起用于列表过滤

如何将django rest过滤与mongoengine一起用于列表过滤
EN

Stack Overflow用户
提问于 2017-01-02 01:20:46
回答 2查看 979关注 0票数 3

views.py

代码语言:javascript
代码运行次数:0
复制
from __future__ import unicode_literals

from rest_framework_mongoengine.viewsets import ModelViewSet as MongoModelViewSet

from app.serializers import *

from rest_framework_mongoengine.generics import * 

from rest_framework import filters    


def index_view(request):
    context = {}
    return TemplateResponse(request, 'index.html', context)


class ToolViewSet(MongoModelViewSet):
    serializer_class = ToolSerializer
    my_filter_fields = ('crop', 'district','taluka','circle','year',) 

    def get_kwargs_for_filtering(self):
        filtering_kwargs = {} 

        for field in  self.my_filter_fields: # iterate over the filter fields
            field_value = self.request.query_params.get(field) # get the value of a field from request query parameter
            if field_value: 
                filtering_kwargs[field] = field_value
        return filtering_kwargs 

    def get_queryset(self):
        queryset = Tool.objects.all() 
        filtering_kwargs = self.get_kwargs_for_filtering() # get the fields with values for filtering 
        if filtering_kwargs:
            queryset = Tool.objects.filter(**filtering_kwargs) # filter the queryset based on 'filtering_kwargs'
        return queryset

这是我的密码。

这是过滤我们想要讲的东西的工作。

例如:http://api/tool/?district=Nasik&crop=banana

但是,它不适用于列表文件--例如:http://api/tool/?district=Nasik&district=Pune --它给出了输出:空的

如何使该过滤器工作,以得到所有地区"Nasik“或区"Pune”

如果我搜索http://api/tool/?crops=guava,banana或http:./tool/? Pune =Nasik,Pune,请帮助我更改获取数据的代码。

给我正确的输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-03 00:19:55

我建议看一看django-rest框架-过滤器。然后,您可以在查询参数中使用诸如__in之类的内容..。

但是,如果您想继续您的方法,我将在您的get_kwargs_for_filtering方法中添加如下逻辑:

代码语言:javascript
代码运行次数:0
复制
def get_kwargs_for_filtering(self):
    filtering_kwargs = {} 

    for field in  self.my_filter_fields: # iterate over the filter fields
        field_value = self.request.query_params.get(field) # get the value of a field from request query parameter
        if field_value: 
            if ',' in field_value: # put your queryParams into an array and use the built-in django filter method '__in'
                filtering_kwargs[field + '__in'] = field_value.split(',')
            else:
                filtering_kwargs[field] = field_value
    return filtering_kwargs

这样,对http://api/tool/?crops=guava,banana的调用就会产生所需的行为。我现在不能测试它是否有效,但这应该会指引你走向正确的方向。

票数 3
EN

Stack Overflow用户

发布于 2022-11-22 05:37:14

虽然这个问题有点老了。在Django、DRF和MongoEngine的后续版本中,这个问题仍然是重要的和有效的。

在回答这个问题的时候,我正在跑

代码语言:javascript
代码运行次数:0
复制
Django==4.1.3
djangorestframework==3.14
django-rest-framework-mongoengine==3.4.1
mongoengine==0.24.2
django-filter==22.1
# patched version of django-mongoengine-filter to support Django 4.0
# https://github.com/oussjarrousse/django-mongoengine-filter 
# Pull request https://github.com/barseghyanartur/django-mongoengine-filter/pull/16 
django-mongoengine-filter>=0.3.5

这个答案的思想是使用django-mongoengine-filterdjango-mongoengine-filter添加过滤支持,这是django-filter的替代或扩展,应该与django-filter的工作方式相同。

首先,让我们编辑项目/setings.py文件。查找INSTALLED_APPS变量并确保添加了以下"Django应用程序“:

代码语言:javascript
代码运行次数:0
复制
# in settings.py:

INSTALLED_APPS = [
    # ...,
    "rest_framework",
    "rest_framework_mongoengine",
    "django_filters",
    # ...,
]

应用程序django_filters需要添加与过滤基础设施相关的类,以及包括用于DRF的html模板在内的其他内容。

然后在变量REST_FRAMEWORK中,我们需要编辑与键DEFAULT_FILTER_BACKENDS相关联的值。

代码语言:javascript
代码运行次数:0
复制
# in settings.py:

REST_FRAMEWORK = {
    # ...
    "DEFAULT_FILTER_BACKENDS": [
        "filters.DjangoMongoEngineFilterBackend",
        # ...
    ],
    # ...
}

DjangoMongoEngineFilterBackend是自定义构建的过滤器后端,我们需要将它添加到文件filters中的文件夹(取决于您如何构造项目)。

代码语言:javascript
代码运行次数:0
复制
# in filters.py:
from django_filters.rest_framework.backends import DjangoFilterBackend

class DjangoMongoEngineFilterBackend(DjangoFilterBackend):
    # filterset_base = django_mongoengine_filter.FilterSet
    """
    Patching the DjangoFilterBackend to allow for MongoEngine support
    """

    def get_filterset_class(self, view, queryset=None):
        """
        Return the `FilterSet` class used to filter the queryset.
        """
        filterset_class = getattr(view, "filterset_class", None)
        filterset_fields = getattr(view, "filterset_fields", None)

        if filterset_class:
            filterset_model = filterset_class._meta.model

            # FilterSets do not need to specify a Meta class
            if filterset_model and queryset is not None:
                element = queryset.first()
                if element:
                    queryset_model = element.__class__
                    assert issubclass(
                        queryset_model, filterset_model
                    ), "FilterSet model %s does not match queryset model %s" % (
                        filterset_model,
                        str(queryset_model),
                    )

            return filterset_class

        if filterset_fields and queryset is not None:
            MetaBase = getattr(self.filterset_base, "Meta", object)

            element = queryset.first()
            if element:
                queryset_model = element.__class__
                class AutoFilterSet(self.filterset_base):
                    class Meta(MetaBase):
                        model = queryset_model
                        fields = filterset_fields

            return AutoFilterSet

        return None

此自定义筛选后端不会引发原始django过滤器后端将引发的异常。django-filter DjangoFilterBackend像在queryset.model中一样访问QuerySet中的键model,但是在MongoEngine中不存在该键。

也许应该考虑在MongoEngine中提供它:https://github.com/MongoEngine/mongoengine/issues/2707 https://github.com/umutbozkurt/django-rest-framework-mongoengine/issues/294

现在,我们可以向ViewSet添加一个自定义筛选器:

代码语言:javascript
代码运行次数:0
复制
# in views.py
from rest_framework_mongoengine.viewsets import ModelViewSet

class MyModelViewSet(ModelViewSet):
    serializer_class = MyModelSerializer
    filter_fields = ["a_string_field", "a_boolean_field"]
    filterset_class = MyModelFilter

    def get_queryset(self):
        queryset = MyModel.objects.all()
        return queryset

最后,让我们回到filters.py并添加MyModelFilter

代码语言:javascript
代码运行次数:0
复制
# in filters.py
from django_mongoengine_filter import FilterSet, StringField, BooleanField
class MyModelFilter(FilterSet):
    """
    MyModelFilter is a FilterSet that is designed to work with the django-filter.
    However the original django-mongoengine-filter is outdated and is causing some troubles
    with Django>=4.0.
    """

    class Meta:
        model = MyModel
        fields = [
            "a_string_field",
            "a_boolean_field",
        ]

    a_string_field = StringFilter()
    a_boolean_field = BooleanFilter()

这应该能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41424053

复制
相关文章
前端:CSS字体大小 px、em、rem的区别
1px的长度表示显示器中一个像素(pixel)的长度,实际显示的效果和显示器的 DPI(Dot Per Inch,每英寸像素数)有关,DPI越大每英寸的像素数越多,每个像素的实际大小越小。通常来说分辨率越高的屏幕 DPI也就越高,所以高分辨率屏幕显示的图标和字体都要更小一些。
渔父歌
2020/03/26
2.2K0
EM Algorithm
EM算法和之前学的都不太一样,EM算法更多的是一种思想,所以后面用几个例子讲解,同时也会重点讲解GMM高斯混合模型。
西红柿炒鸡蛋
2018/09/07
1.1K0
为什么你永远不应该在CSS中使用px来设置字体大小
代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
前端小智@大迁世界
2023/04/06
1.8K0
为什么你永远不应该在CSS中使用px来设置字体大小
EM算法
推导EM算法之前,先引用《统计学习方法》中EM算法的例子: 例1. (三硬币模型) 假设有3枚硬币,分别记作A,B,C。这些硬币正面出现的概率分别为π,p和q。投币实验如下,先投A,如果A是正面,即A=1,那么选择投B;A=0,投C。最后,如果B或者C是正面,那么y=1;是反面,那么y=0;独立重复n次试验(n=10),观测结果如下: 1,1,0,1,0,0,1,0,1,1假设只能观测到投掷硬币的结果,不能观测投掷硬币的过程。问如何估计三硬币正面出现的概率,即π,p和q的值。 解:设随机变量y是观测变量,
昱良
2018/04/08
1.1K0
EM算法
为什么不推荐使用PHPicker
iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker 的优点:
ios-lan
2020/10/23
2.6K0
为什么不推荐使用PHPicker
EM Algorithm
EM算法和之前学的都不太一样,EM算法更多的是一种思想,所以后面用几个例子讲解,同时也会重点讲解GMM高斯混合模型。
西红柿炒鸡蛋
2019/01/23
6100
MySQL为什么不推荐使用in
当然,每个具体的情况都是不同的,所以在选择查询操作符时,我们需要根据具体的需求和数据情况进行评估和测试。在优化查询性能时,我们可以使用MySQL的查询分析工具来帮助我们理解查询的执行计划和性能瓶颈,从而做出更好的决策。
程序员朱永胜
2023/09/07
3670
idea修改文字大小_为什么idea设置不了字体大小
第三步:选择Appearance选项,选择size设置自己喜欢的大小即可,我设置为14
全栈程序员站长
2022/09/27
9700
idea修改文字大小_为什么idea设置不了字体大小
EM算法
总第82篇 01|概念及原理: EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计,或极大后验概率估计。EM算法的每次迭代分两步完成:E步,求期望(expectation);M步,求极大值(maximization).所以这一算法称为期望极大算法,简称EM算法。(你看懂了吗?反正我第一次看是一脸懵。没关系接下来通过一个例子,你就能明白了。) (三硬币模型) 假设有A,B,C这些硬币正面出现的概率分别是π,p和q。进行如下掷硬币试验:先掷硬币A,根据其结果选出硬币B或C,正面选硬币B,反
张俊红
2018/04/11
1.1K0
EM算法
EM 算法
EM 算法,指的是最大期望算法(Expectation Maximization Algorithm,期望最大化算法),是一种迭代算法,在统计学中被用于寻找,依赖于不可观察的隐性变量的概率模型中,参数的最大似然估计。基本思想是首先随机取一个值去初始化待估计的参数值,然后不断迭代寻找更优的参数使得其似然函数比原来的似然函数大。
润森
2019/11/09
9410
rem与em详解
em 和 rem都是灵活、 可扩展的单位,由浏览器转换为像素值,具体取决于您的设计中的字体大小设置。 如果你使用值 1em 或 1rem,它可以被浏览器翻译成 从16px到 160px 或其他任意值。
4O4
2022/04/25
4.7K0
rem与em详解
EM算法原理总结
EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM), LDA主题模型的变分推断等等。本文就对EM算法的原理做一个总结。 1. EM算法要解决的问题 我们经常会从样本观察数据中,找出样本的模型参数。 最常用的方法就是极大化模型分布的对数似然函数。 但是在一些情况下,我们得到的观察数据有未观察到的隐含数据,此时我们未知的有隐含数据和模型参数,因而无法直接用极大化对数似然函数得到模型分布的参数。怎么办呢?这
企鹅号小编
2018/02/07
1.4K0
EM算法原理总结
EM算法原理总结
地址:http://www.cnblogs.com/pinard/p/6912636.html
机器学习算法工程师
2018/07/26
8540
EM算法原理总结
为什么 MySQL 不推荐使用 join?
作者:李博 , 链接: https://cnblogs.com/liboware/p/12740901.html
Java小咖秀
2021/04/07
2.1K0
为什么 MySQL 不推荐使用 join?
理解EM算法
EM( expectation-maximization,期望最大化)算法是机器学习中与SVM(支持向量机)、概率图模型并列的难以理解的算法,主要原因在于其原理较为抽象,初学者无法抓住核心的点并理解算法求解的思路。本文对EM算法的基本原理进行系统的阐述,并以求解高斯混合模型为例说明其具体的用法。文章是对已经在清华大学出版社出版的《机器学习与应用》一书中EM算法的讲解,对部分内容作了扩充。
SIGAI学习与实践平台
2019/01/23
1.2K0
理解EM算法
CSS 你到底有多少长度单位?
听说糙着干活的只靠 px 和 % 闯天下,不知道在看文章的你是不是也是其中一员,哈哈哈哈
全栈程序员站长
2022/06/30
4520
为什么不建议 for 循环里 String ++?
都说 StringBuilder 在处理字符串拼接上效率要强于 String,但有时候我们的理解可能会存在一定的偏差。最近我在测试数据导入效率的时候就发现我以前对 StringBuilder 的部分理解是错误的。后来我通过实践测试 + 找原理 的方式搞清楚了这块的逻辑。现在将过程分享给大家
开发者技术前线
2020/11/24
9930
为什么不建议 for 循环里 String ++?
为什么不建议你使用SELECT *
“不要使用SELECT *”几乎已经成为了MySQL使用的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用*作为查询的字段列表,更是让这条规则拥有了权威的加持。
蝉沐风
2022/08/05
2.6K2
为什么不建议你使用SELECT *
为什么不推荐Selenium写爬虫
最近在群里经常会看到有些朋友说,使用Selenium去采集网站,我看到其实内心是很难受的,哎!为什么要用Selenium呢? 我想说下自己的看法,欢迎各位大佬批评。 观点 如果可以使用 Requests 完成的,别用 Selenium 数据采集的顺序 接到一个项目或者有一个采集需求时,第一步就是明确自己的需求。经常会遇到半路改需求的事情,真的很难受。 第二步就是去分析这个网站,这个在之前有提到过 采集方案策略之App抓包 : 首先大的地方,我们想抓取某个数据源,我们要知道大概有哪些路径可以获取到数据源,基本
小歪
2018/04/04
2.2K0
为什么不推荐Selenium写爬虫
06. 为什么不 ban 猛犸?
无论是 Dota、LOL 还是其它 MOBA 游戏,比赛中均存在着 Ban Pick 机制:参与比赛的双方队伍通过数轮禁用/选取英雄后,最终确定游戏比赛的英雄阵容。
五分钟学算法
2022/02/21
5900
06. 为什么不 ban 猛犸?

相似问题

为什么em中的字体大小和重要号不覆盖px中的字体大小?

26

增加em的字体大小

11

为什么em字体大小不随字体类型而改变?

24

CSS:什么/为什么指定字体大小为字体大小:14 as /1.31em?

13

字体大小em单元继承问题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文