Django:从`QuerySet`中提取`Q`对象

时间:2012-03-14 14:06:30

标签: python django django-orm django-q

我有一个Django QuerySet,我希望得到一个Q对象。 (即,它与该查询集保持完全相同的查询。)

这可能吗?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:4)

不,但你可以先创建Q对象,然后使用它;或者,将您的查询创建为dict,并将其传递给您的过滤器方法和Q对象。

答案 1 :(得分:3)

这不是您要求的,但您可以通过访问查询成员从查询集中提取sql。例如:

x = somequeryset.query

然后,您可以在新的queryset对象上使用它来重建原始查询集。这可以更好地保存为查询集定义的“值”之类的东西。定义的x很容易存储。我过去曾使用它来保存用户构造的查询/搜索,然后每天运行,并将结果通过电子邮件发送给用户。

答案 2 :(得分:0)

如果您想要Q对象以便通过对另一个Q对象进行OR运算来重建复杂查询,那么,如果两个QuerySets位于同一模型上,您可以直接对QuerySets进行相同的效果。值得尝试并在之前和之后检查SQL。

例如:

string json = "{\"request\":{\"path\":\"1\",\"coverages\":{\"path\":\"2\",\"broadcastCoverage\":{\"path\":\"3\",\"name\":\"First Coverage\",\"channel\":\"Channel 9\",\"callSign\":\"DSOTM\"},\"internetCoverage\":{\"path\":\"4\",\"name\":\"Second Coverage\",\"url\":\"www.stackoverflow.com\"},\"thirdCoverage\":{\"path\":\"5\",\"name\":\"Third Coverage\",\"differentProperty\":\"Units\"}}}}";

var jsonReq = JObject.Parse(json);
var pathVal = jsonReq["request"]["path"].Value<string>();
var coverageObjects = jsonReq["request"]["coverages"].Value<JObject>();
var filteredObjects = coverageObjects.Children().Where(x => x.Value<JProperty>().Name.EndsWith("Coverage"));
var dictionary = filteredObjects.Select(x => new KeyValuePair<string, string>(x.Value<JProperty>().Name, x.Value<JProperty>().Value.ToString()));

// reformatted Json
var newJson = "{ \"path\":\"" + pathVal + "\", \"coverages\" : [" + String.Join(",", dictionary.Select(x => x.Value).ToList()) + "]}";
Request reqC = JsonConvert.DeserializeObject<Request>(newJson);

我当然找到了你的问题,因为我想从查询中找到Q对象,并在Django Users Group上发现:

https://groups.google.com/d/msg/django-users/2BuFFMDL0VI/dIih2WRKAgAJ

QuerySets的组合方式与Q对象的组合方式大致相同。

这可能对你有帮助,也可能没有帮助,这取决于你当然想要Q对象的原因。