【问题标题】:Can django filter queryset based on a dictionary field?django 可以根据字典字段过滤查询集吗?
【发布时间】:2016-08-10 10:24:19
【问题描述】:

我正在研究其他人编写和配置的 django rest-api 框架,但遇到了一个我找不到任何好的解决方案的问题。

有一个模型包含“YAMLField”类型的字段。在尝试检索此字段成员时,它被转换为 OrderedDict(不太清楚这种转换是如何以及在何处发生的......)。

现在,我有这个模型的查询集。我了解如何根据简单属性过滤查询集,但是如何根据此字典过滤它?

例如,此查询集中的每个条目(即 MyModel 实例)包含:

MyModel.myDictionary == {'firstKey': 'firstVal', 'secondKey':'secondVal}

现在我想从这个查询集中获取所有条目,其中:

myDictionary = {'firstKey': 'Something'}

意思是,我要过滤的字典可能只包含键的子集。

我找不到任何解决方案或直接的方法来做到这一点,导致我迭代查询集并为每个条目迭代字典。 这感觉开销太大了...

【问题讨论】:

  • 如果我理解正确并且您的字典键是模型的主键,那么您可以使用 my_dictionary.keys() 将所有键作为列表并在查询集字段查找中使用它,例如 MyModel.objects。过滤器(id__in=my_dictionary.keys())。不要忘记用下划线而不是 CamelCase 来命名 PEP8 风格的变量和字段。
  • 感谢您的回答。字典键不是主模型键。字典是模型键,但我想根据字典的内容进行过滤。我最终使用了这是一个 YAMLField 的事实,并在我连接了我想从该字典中过滤的所有值之后,在该字段中进行了正则表达式搜索。

标签: python django filter django-rest-framework


【解决方案1】:

我想我遇到了同样的问题,有人告诉我一个直截了当的答案,包括在您的过滤请求中添加“__{dictionary_key}”,例如,在您的情况下:

 Model.objects.all().filter(myDictionary__firstKey="Something")

虽然答案可能来得太晚了,但我还是发布了它,希望它对以后的其他人有用!

【讨论】:

    【解决方案2】:

    你需要这是可能的。有关更多信息,请参阅 django-rest-framework doc

    class MultipleFieldLookupMixin(object):
        """
        Apply this mixin to any view or viewset to get multiple field filtering
        based on a `lookup_fields` attribute, instead of the default single field filtering.
        """
        def get_object(self):
            queryset = self.get_queryset()             # Get the base queryset
            queryset = self.filter_queryset(queryset)  # Apply any filter backends
            filter = {}
            for field in self.lookup_fields:
                filter[field] = self.kwargs[field]
            return get_object_or_404(queryset, **filter)  # Lookup the object
    

    【讨论】:

    • 谢谢,但我不确定它是否能满足我的需要,或者我只是没有完全理解它。无论如何,正如我在问题的评论中所写的那样,我找到了另一种解决方案。再次感谢您的帮助
    猜你喜欢
    • 2016-07-20
    • 2020-12-19
    • 2017-12-26
    • 2011-07-18
    • 2018-01-05
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多