V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shoumu
V2EX  ›  Django

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

  •  
  •   shoumu ·
    shoumu · 2014-09-07 00:42:51 +08:00 · 15229 次点击
    这是一个创建于 3736 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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种,太复杂了。

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

    11 条回复    2014-09-09 09:12:53 +08:00
    ericls
        1
    ericls  
       2014-09-07 03:43:57 +08:00 via Android
    感觉这个逻辑本来就这么复杂。。
    不过用Q写起来肯定会方便些。 另外django1.7的custom lookup 也写起来舒服点
    casparchen
        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 )就好。
    casparchen
        3
    casparchen  
       2014-09-07 07:17:20 +08:00 via iPad
    你就可以在前面的基础上,最后判断type然后加一个条件
    casparchen
        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/
    xiaket
        5
    xiaket  
       2014-09-07 11:12:15 +08:00 via iPhone
    搜索条件不应是Django里面的模型吧?这种逻辑写到视图函数里?
    shoumu
        6
    shoumu  
    OP
       2014-09-07 13:31:35 +08:00
    @xiaket 不太明白你的意思。我觉得按我之前的逻辑检索组合情况太多了,就太复杂了,所以就问一下大家有没有好的解决办法。
    shoumu
        7
    shoumu  
    OP
       2014-09-07 13:33:03 +08:00
    @casparchen 非常感谢,我去看看。
    shoumu
        8
    shoumu  
    OP
       2014-09-07 13:38:17 +08:00
    @ericls 请问Q是什么意思?我去看看custom lookup。
    ericls
        9
    ericls  
       2014-09-07 21:02:07 +08:00 via Android   ❤️ 1
    @shoumu Google一下吧 我这手机 不好意思
    xiaket
        10
    xiaket  
       2014-09-09 09:10:30 +08:00
    @shoumu 如果这句都看不懂, 说明对Django的MVT理解得不是很深入. 去看看文档里这部分内容吧.
    shoumu
        11
    shoumu  
    OP
       2014-09-09 09:12:53 +08:00
    @xiaket 我去看看,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.