2013-03-26 24 views
0

我有一些调用查询集上的values_list的现有代码。我需要为这个查询集增加一些额外的东西。如果我在values_list之前调用extra,额外的东西从values_list之后的查询中消失了。如果在调用values_list之后调用extra,它似乎必须生效 - 额外的东西不在查询中。在相同的查询集上使用values_list和extra

这是一些调试器输出。额外values_list面前 - 它的存在,然后消失了:

-> queryset = queryset.extra(select={field['name'] : field['name']}) 
(Pdb) n 
-> queryset = queryset.values_list(*self.get_search_columns()) 
(Pdb) print queryset.query 
SELECT (top-bottom) AS `top-bottom`, .... 
(Pdb) n 
-> data = list(queryset) 
(Pdb) print queryset.query 
SELECT `data_cst`.`image_measurer_id`, `data_cst`.`image_pr_top_id`, 
`data_target`.`name`, `data_recipe`.`name`, `data_cst`.`ep`, 
`data_lot`.`name`, `data_cst`.`date_time`, `data_cst`.`bottom` FROM 
`data_cst` INNER JOIN `data_target` ON (`data_cst`.`target_name_id` = 
`data_target`.`id`) INNER JOIN `data_recipe` ON 
(`data_cst`.`recipe_id` = `data_recipe`.`id`) INNER JOIN `data_lot` ON 
(`data_cst`.`lot_id` = `data_lot`.`id`) WHERE (`data_cst`.`date_time` 
<= 2013-03-26 23:59:59 AND `data_cst`.`date_time` >= 2010-03-26 
00:00:00) ORDER BY `data_cst`.`date_time` DESC 

但是,如果我扭转额外不会对查询所有订单:

-> queryset = queryset.values_list(*self.get_search_columns()) 
(Pdb) n 
-> queryset = queryset.extra(select={field['name'] : field['name']}) 
(Pdb) print queryset.query 
SELECT `data_cst`.`image_measurer_id`, `data_cst`.`image_pr_top_id`, 
`data_target`.`name`, `data_recipe`.`name`, `data_cst`.`ep`, 
`data_lot`.`name`, `data_cst`.`date_time`, `data_cst`.`bottom` FROM 
`data_cst` INNER JOIN `data_target` ON (`data_cst`.`target_name_id` = 
`data_target`.`id`) INNER JOIN `data_recipe` ON 
(`data_cst`.`recipe_id` = `data_recipe`.`id`) INNER JOIN `data_lot` ON 
(`data_cst`.`lot_id` = `data_lot`.`id`) WHERE (`data_cst`.`date_time` 
<= 2013-03-26 23:59:59 AND `data_cst`.`date_time` >= 2010-03-26 
00:00:00) ORDER BY `data_cst`.`date_time` DESC 
{Pdb) n 
-> data = list(queryset) 
(Pdb) print queryset.query 
SELECT `data_cst`.`image_measurer_id`, `data_cst`.`image_pr_top_id`, 
`data_target`.`name`, `data_recipe`.`name`, `data_cst`.`ep`, 
`data_lot`.`name`, `data_cst`.`date_time`, `data_cst`.`bottom` FROM 
`data_cst` INNER JOIN `data_target` ON (`data_cst`.`target_name_id` = 
`data_target`.`id`) INNER JOIN `data_recipe` ON 
(`data_cst`.`recipe_id` = `data_recipe`.`id`) INNER JOIN `data_lot` ON 
(`data_cst`.`lot_id` = `data_lot`.`id`) WHERE (`data_cst`.`date_time` 
<= 2013-03-26 23:59:59 AND `data_cst`.`date_time` >= 2010-03-26 
00:00:00) ORDER BY `data_cst`.`date_time` DESC 

是否有某种方式同时使用values_list和额外的相同的查询集?

这里是展示它不工作很简单的例子:

(Pdb) CST.objects.all().extra(select={'ep': 1}).values_list('image_measurer_id') 
[(86456L,), (86454L,), (86452L,), (86450L,), (86448L,), (86446L,), 
(86444L,), (86442L,), (86440L,), (86438L,), (86436L,), (86434L,), 
(86432L,), (86430L,), (86428L,), (86426L,), (86424L,), (86422L,), 
(86420L,), (86418L,), '...(remaining elements truncated)...'] 

这应该每行返回2列。

+0

您提供的信息并不便于您使用。提供来自PDB之外的信息,记录你所在的班级以及字段['name']是什么 – MattH 2013-03-27 12:48:18

+0

刚刚通过一个简单的例子更新了我的文章。 – 2013-03-27 13:27:20

回答

1

您需要在values_list中包含额外的选择。

E.g.

CST.objects.extra(select={'ep': 1}).values_list('image_measurer_id','ep') 
+0

Doh!非常感谢! – 2013-03-27 20:01:07

相关问题