【问题标题】:django - queryset include element at start of each result rowdjango - 查询集在每个结果行的开头包含元素
【发布时间】:2014-01-24 06:30:42
【问题描述】:

我有一个返回结果的查询 -

[{'trgjob_id': 22659, 'trgmst_id': 'Tidal - Default Email Abnormal', 'jobmst_id': 10081, 'trgjob_order': 1, 'trgjob_type': 0, 'trgjob_level': 0}, 
{'trgjob_id': 29054, 'trgmst_id': 'CADIS - DMS Email Abnormal ', 'jobmst_id': 10081, 'trgjob_order': 2, 'trgjob_type': 0, 'trgjob_level': 0}, 
{'trgjob_id': 29055, 'trgmst_id': 'CADIS - DMS Email Error ', 'jobmst_id': 10081, 'trgjob_order': 3, 'trgjob_type': 0, 'trgjob_level': 0}]

我想做的是在每个结果的开头添加模型名称 - trgjob(这里有 3 个结果)。我该怎么做呢?

把它放在所有结果的开头很容易我只是这样做 -

{'trgjob': trgjobstring.data}

在上面的例子中编辑我希望它看起来像这样 -

['trgjob': 
    {'trgjob_id': 22659, 'trgmst_id': 'Tidal - Default Email Abnormal', 'jobmst_id': 10081, 'trgjob_order': 1, 'trgjob_type': 0, 'trgjob_level': 0},
'trgjob': 
    {'trgjob_id': 29054, 'trgmst_id': 'CADIS - DMS Email Abnormal ', 'jobmst_id': 10081, 'trgjob_order': 2, 'trgjob_type': 0, 'trgjob_level': 0},
'trgjob':
    {'trgjob_id': 29055, 'trgmst_id': 'CADIS - DMS Email Error ', 'jobmst_id': 10081, 'trgjob_order': 3, 'trgjob_type': 0, 'trgjob_level': 0}]

如果语法看起来不正确,我深表歉意。我实际上并不知道“应该”看起来如何,但我知道我想要每行开头的数据。

编辑-

我有一个自定义序列化程序,它正在将此数据转储到 XML 中,现在它正在以我不想要的方式对其进行格式化(无论它是否正确)。

<list-item>
    <list-item>
        <trgjob_id>245970</trgjob_id>
        <trgmst_id>nope</trgmst_id>
        <jobmst_id>34614</jobmst_id>
        <trgjob_order>1</trgjob_order>
        <trgjob_type>0</trgjob_type>
        <trgjob_level>0</trgjob_level>
    </list-item>
    <list-item>
        <trgjob_id>245969</trgjob_id>
        <trgmst_id>blah</trgmst_id>
        <jobmst_id>34614</jobmst_id>
        <trgjob_order>2</trgjob_order>
        <trgjob_type>0</trgjob_type>
        <trgjob_level>0</trgjob_level>
    </list-item>
</list-item>

所以 1. 我需要 list-item 成为我在原始问题中的“trgjob”。

  1. 我不想要 2 级列表项。

我希望 XML 看起来像这样 -

    <trgjob>
        <trgjob_id>245970</trgjob_id>
        <trgmst_id>nope</trgmst_id>
        <jobmst_id>34614</jobmst_id>
        <trgjob_order>1</trgjob_order>
        <trgjob_type>0</trgjob_type>
        <trgjob_level>0</trgjob_level>
    </trgjob>
    <trgjob>
        <trgjob_id>245969</trgjob_id>
        <trgmst_id>blah</trgmst_id>
        <jobmst_id>34614</jobmst_id>
        <trgjob_order>2</trgjob_order>
        <trgjob_type>0</trgjob_type>
        <trgjob_level>0</trgjob_level>
    </trgjob>

我最接近这一点的是从渲染器中删除“列表项”并更改视图,但我目前只知道如何将“trgjob”放在所有结果的开头而不是每个结果的开头一个。

【问题讨论】:

  • 我找不到您需要这样做的理由。你能解释一下为什么吗?
  • 当结果转到我的自定义序列化程序时,我需要它来分隔它,这样它就不会显示一个列表下的所有值,而是单独显示。我会更新我的问题。
  • 您是在问如何从给定对象访问模型名称?
  • 另外,使用 {'trgjob': [QuerySet of items]} 而不是重复 3 次不是更有意义吗?
  • 看到您的编辑,您的问题更有意义。我可以建议您向我们展示序列化程序的代码(或您使用的工具),我们将帮助您了解如何以您想要的方式使用它?

标签: django


【解决方案1】:

假设我已经很好地理解了你的问题,我会这样做:

In [1]: qs_results = [{'trgjob_id': 22659, 'trgmst_id': 'Tidal - Default Email Abnormal', 'jobmst_id': 10081, 'trgjob_order': 1, 'trgjob_type': 0, 'trgjob_level': 0}, 
   ...: {'trgjob_id': 29054, 'trgmst_id': 'CADIS - DMS Email Abnormal ', 'jobmst_id': 10081, 'trgjob_order': 2, 'trgjob_type': 0, 'trgjob_level': 0}, 
   ...: {'trgjob_id': 29055, 'trgmst_id': 'CADIS - DMS Email Error ', 'jobmst_id': 10081, 'trgjob_order': 3, 'trgjob_type': 0, 'trgjob_level': 0}]

In [2]: client_results = [{'trgjob':item} for item in qs_results]

In [3]: client_results
Out[3]: 
[{'trgjob': {'jobmst_id': 10081,
   'trgjob_id': 22659,
   'trgjob_level': 0,
   'trgjob_order': 1,
   'trgjob_type': 0,
   'trgmst_id': 'Tidal - Default Email Abnormal'}},
 {'trgjob': {'jobmst_id': 10081,
   'trgjob_id': 29054,
   'trgjob_level': 0,
   'trgjob_order': 2,
   'trgjob_type': 0,
   'trgmst_id': 'CADIS - DMS Email Abnormal '}},
 {'trgjob': {'jobmst_id': 10081,
   'trgjob_id': 29055,
   'trgjob_level': 0,
   'trgjob_order': 3,
   'trgjob_type': 0,
   'trgmst_id': 'CADIS - DMS Email Error '}}]

键在第 2 行,它为查询集结果 qs_results 中的每个 dict 项添加一个键。

【讨论】:

  • 我觉得这是一个不好的答案,不是因为它是错误的,而是因为虽然这对 python 来说是一个很好的解决方案,但它不是好的 django 代码
  • 谢谢乔斯维克!这已经完成了我想要的。我现在可以继续自定义我的视图。正在尝试匹配旧版应用程序的输出。
  • django 中的列表理解意味着lot more queries to the database。最好想办法使用django ORM。即使在 OP 的代码中,他已经将信息提取到列表中,您也可以立即将整个内容提取为所需的格式(更不用说使用他的序列化程序可能有一种更好的重复性较低的方式,而他只是没有意识到)
  • @yuvi 我同意你的观点,但那是premature optimization。重新 XML 序列化;那是新的不是吗?如果要序列化数据,那么最有效的方法取决于xml序列化部分,这超出了本问题的原始主题。
  • 这就是为什么我评论了 OP 问题,要求查看序列化程序本身,以及为什么我认为技术上可行的解决方案不一定是好的解决方案。
【解决方案2】:

保持懒惰:

for item in qs_results:
    yield {'trgjob':item}

【讨论】:

  • 这应该是对我的回答的评论。您甚至使用了我在答案中使用的变量名;)虽然它仍然是一个很好的答案,但没有否决您的答案。
猜你喜欢
  • 2014-02-23
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2013-01-19
  • 2021-12-12
相关资源
最近更新 更多