• django模型方法extra


    ## select提供简单数据
    # SELECT age, (age > 18) as is_adult FROM myapp_person;
    Person.objects.all().extra(select={'is_adult': "age > 18"})  # 加在select后面
    
    ## where提供查询条件
    # SELECT * FROM myapp_person WHERE first||last ILIKE 'jeffrey%';
    Person.objects.all().extra(where=["first||last ILIKE 'jeffrey%'"])  # 加一个where条件
    
    ## table连接其它表
    # SELECT * FROM myapp_book, myapp_person WHERE last = author_last
    Book.objects.all().extra(table=['myapp_person'], where=['last = author_last']) # 加from后面
    
    ## params添参数
    # !! 错误的方式 !!
    first_name = 'Joe'  # 如果first_name中有SQL特定字符就会出现漏洞
    Person.objects.all().extra(where=["first = '%s'" % first_name])
    # 正确方式
    Person.objects.all().extra(where=["first = '%s'"], params=[first_name])

     extra源码

    def extra(self, select=None, where=None, params=None, tables=None,
                  order_by=None, select_params=None):
            """
            Adds extra SQL fragments to the query.
            """
            assert self.query.can_filter(), 
                    "Cannot change a query once a slice has been taken"
            clone = self._clone()
            clone.query.add_extra(select, select_params, where, params, tables, order_by)
            return clone

     原文:https://my.oschina.net/hevakelcj/blog/383179

    #相关子查询,而且只能select一个值(a.id),否则报错:当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式
    InnerMail.objects.extra(select={'status':'select a.id from letter_imail_status a where a.id=letter_innermail.id'})
  • 相关阅读:
    java
    java
    java
    js
    java
    异常之异常处理
    面向对象之元类
    面向对象之内置方法
    面向对象之反射
    面向对象之类方法与静态方法
  • 原文地址:https://www.cnblogs.com/songbird/p/7562923.html
Copyright © 2020-2023  润新知