Django model 遇到查询条件组合比较多的情况下怎么写?

2014-09-07 00:42:51 +08:00
 shoumu
class Search(models.Model):
    date1 = models.DateTimeField()
    date2 = models.DateTimeField()
    type1 = models.IntegerField()
    type2 = models.IntegerField()

type1和type2只能够取0或者1。现在要对这张表进行查询,输入的参数包括d1, d2 DateTime类型,t1, t2, date_search_type Integer类型。 查询要求如下:
当 date_search_type == 0 时, 查询要求d1 < date1 < d2
当 date_search_type == 1 时, 查询要求d1 < date2 < d2
当 date_search_type == 2 时, 查询要求date1 > d1, date2 < d2

当t1 == 0 时,查询type1 == 0的项,
当t1 == 1 时,查询type1 == 1的项,
当t1 == 其它是,所有type1项都符合要求。

t2对于type2的影响同t1对type1的影响。

之前只是根据datesearch_type来查询的时候,我试图先得到一个str='date1gte=d1,date2_lte=d2'的字符串,然后带入到Search.objects.filter()里面,但是发现能执行,就写了3个Search.objects.filter(),但是现在加入了type1和type2,如果继续按照上面那样做的话组合的情况就会达到27种,太复杂了。

请问一下这个时候怎么来处理比较好呢?谢谢大家

15102 次点击
所在节点    Django
11 条回复
ericls
2014-09-07 03:43:57 +08:00
感觉这个逻辑本来就这么复杂。。
不过用Q写起来肯定会方便些。 另外django1.7的custom lookup 也写起来舒服点
casparchen
2014-09-07 07:15:27 +08:00
没有用过djongo,但是我想应该都是差不多的,这类orm的filter或者where方法返回的都是一个query对象,所以应该是可以连续使用filter的。
比如你前面写了a = search.objects.filter( xxx ), 然后你想再加一个条件,就继续a.filter( yy )就好。
casparchen
2014-09-07 07:17:20 +08:00
你就可以在前面的基础上,最后判断type然后加一个条件
casparchen
2014-09-07 07:20:01 +08:00
帮你找了一下,果然是可以的,请看Filtered QuerySets are unique那一节。
https://docs.djangoproject.com/en/1.7/topics/db/queries/
xiaket
2014-09-07 11:12:15 +08:00
搜索条件不应是Django里面的模型吧?这种逻辑写到视图函数里?
shoumu
2014-09-07 13:31:35 +08:00
@xiaket 不太明白你的意思。我觉得按我之前的逻辑检索组合情况太多了,就太复杂了,所以就问一下大家有没有好的解决办法。
shoumu
2014-09-07 13:33:03 +08:00
@casparchen 非常感谢,我去看看。
shoumu
2014-09-07 13:38:17 +08:00
@ericls 请问Q是什么意思?我去看看custom lookup。
ericls
2014-09-07 21:02:07 +08:00
@shoumu Google一下吧 我这手机 不好意思
xiaket
2014-09-09 09:10:30 +08:00
@shoumu 如果这句都看不懂, 说明对Django的MVT理解得不是很深入. 去看看文档里这部分内容吧.
shoumu
2014-09-09 09:12:53 +08:00
@xiaket 我去看看,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/132149

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX