【问题标题】:Django: Add arbitrary additional data to a querysetDjango:向查询集添加任意附加数据
【发布时间】:2015-04-28 21:06:56
【问题描述】:

我正在尝试根据搜索显示我的数据地图。处理地图显示的最简单方法是对搜索生成的查询集进行序列化,实际上使用 .但是,我真的很想允许多次搜索,显示的点以用户选择的颜色显示。用户选择的颜色,显然不能来自数据库,因为它不是这些对象的属性,所以这里没有一个聚合器有意义。

我尝试过简单地创建一个实用程序类,因为我真正需要的是在两个模型类之间进行一些复杂的连接,然后将其序列化为 geojson。然而,一旦我创建了该实用程序类,很明显我失去了拥有查询集的很多好处,尤其是使用 django-geojson 轻松序列化数据的能力(或者一旦我可以让 1.8 顺利运行)。

基本上,我希望能够执行以下操作:

querySet = datumClass.objects.filter(...用户提交的搜索参数...).annotate(color='blue')

这可能吗?看起来这会更优雅,并且会比我当前的非模型实用程序类解决方案更好,当我尝试使用 python-geojson 进行序列化时,该解决方案存在一些严重的序列化问题。

【问题讨论】:

  • 我在理解您的用例时遇到了一些麻烦,但这不是 .extra(color='blue') 的工作吗?

标签: django django-models


【解决方案1】:

不太确定您要达到什么目的,但您可以向您的对象添加额外的属性,以在 .这些可以从模板中访问。

for object in queryset :
    if object.contition = 'a'
        object.color = 'blue'
    else:
        object.color = 'green'

【讨论】:

  • 免责声明:当您重新评估查询集或对其进行更多过滤时,此方法会中断。
【解决方案2】:

问题是 extra 带有各种关于有用或弃用的警告......但这有效:

.extra(select={'color': "'blue'"})

注意包裹字符串值的双引号。

这转化为:

SELECT ('blue') AS "color"

【讨论】:

  • 这确实有效,但由于即将弃用,我更喜欢使用@wobbily_col 建议。
【解决方案3】:

如果您有一个将字段映射到值的字典,您可以执行以下操作

filter_dictionary = {
    'date__lte' : '2014-03-01'
}
qs = DatumClass.objects.filter(**filter_dictionary)

而qs 的所有日期都小于该日期(如果它有一个date 字段)。因此,作为用户,我可以提交您可以放入字典中的任何键值对。

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2021-04-02
    • 2020-07-19
    • 2011-11-06
    相关资源
    最近更新 更多