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种,太复杂了。
请问一下这个时候怎么来处理比较好呢?谢谢大家
1
ericls 2014-09-07 03:43:57 +08:00 via Android
感觉这个逻辑本来就这么复杂。。
不过用Q写起来肯定会方便些。 另外django1.7的custom lookup 也写起来舒服点 |
2
casparchen 2014-09-07 07:15:27 +08:00 via iPad
没有用过djongo,但是我想应该都是差不多的,这类orm的filter或者where方法返回的都是一个query对象,所以应该是可以连续使用filter的。
比如你前面写了a = search.objects.filter( xxx ), 然后你想再加一个条件,就继续a.filter( yy )就好。 |
3
casparchen 2014-09-07 07:17:20 +08:00 via iPad
你就可以在前面的基础上,最后判断type然后加一个条件
|
4
casparchen 2014-09-07 07:20:01 +08:00 via iPad 1
帮你找了一下,果然是可以的,请看Filtered QuerySets are unique那一节。
https://docs.djangoproject.com/en/1.7/topics/db/queries/ |
5
xiaket 2014-09-07 11:12:15 +08:00 via iPhone
搜索条件不应是Django里面的模型吧?这种逻辑写到视图函数里?
|
6
shoumu OP @xiaket 不太明白你的意思。我觉得按我之前的逻辑检索组合情况太多了,就太复杂了,所以就问一下大家有没有好的解决办法。
|
7
shoumu OP @casparchen 非常感谢,我去看看。
|