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 ![]() 帮你找了一下,果然是可以的,请看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 非常感谢,我去看看。 |