V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
shoumu
V2EX  ›  Django

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

  •  
  •   shoumu ·
    shoumu · Sep 7, 2014 · 15745 views
    This topic created in 4251 days ago, the information mentioned may be changed or developed.
    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 replies    2014-09-09 09:12:53 +08:00
    ericls
        1
    ericls  
       Sep 7, 2014 via Android
    感觉这个逻辑本来就这么复杂。。
    不过用Q写起来肯定会方便些。 另外django1.7的custom lookup 也写起来舒服点
    casparchen
        2
    casparchen  
       Sep 7, 2014 via iPad
    没有用过djongo,但是我想应该都是差不多的,这类orm的filter或者where方法返回的都是一个query对象,所以应该是可以连续使用filter的。
    比如你前面写了a = search.objects.filter( xxx ), 然后你想再加一个条件,就继续a.filter( yy )就好。
    casparchen
        3
    casparchen  
       Sep 7, 2014 via iPad
    你就可以在前面的基础上,最后判断type然后加一个条件
    casparchen
        4
    casparchen  
       Sep 7, 2014 via iPad   ❤️ 1
    帮你找了一下,果然是可以的,请看Filtered QuerySets are unique那一节。
    https://docs.djangoproject.com/en/1.7/topics/db/queries/
    xiaket
        5
    xiaket  
       Sep 7, 2014 via iPhone
    搜索条件不应是Django里面的模型吧?这种逻辑写到视图函数里?
    shoumu
        6
    shoumu  
    OP
       Sep 7, 2014
    @xiaket 不太明白你的意思。我觉得按我之前的逻辑检索组合情况太多了,就太复杂了,所以就问一下大家有没有好的解决办法。
    shoumu
        7
    shoumu  
    OP
       Sep 7, 2014
    @casparchen 非常感谢,我去看看。
    shoumu
        8
    shoumu  
    OP
       Sep 7, 2014
    @ericls 请问Q是什么意思?我去看看custom lookup。
    ericls
        9
    ericls  
       Sep 7, 2014 via Android   ❤️ 1
    @shoumu Google一下吧 我这手机 不好意思
    xiaket
        10
    xiaket  
       Sep 9, 2014
    @shoumu 如果这句都看不懂, 说明对Django的MVT理解得不是很深入. 去看看文档里这部分内容吧.
    shoumu
        11
    shoumu  
    OP
       Sep 9, 2014
    @xiaket 我去看看,谢谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4619 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 10:07 · PVG 18:07 · LAX 03:07 · JFK 06:07
    ♥ Do have faith in what you're doing.