django中orm操作拾遗

1.在django中操作原生sql

   (1)connection:  

    from django.db import connection, connections(通过传'default'不同,可使用多个数据库)
    cursor = connection.cursor()       # cursor = connections['default'].cursor()
    cursor.execute("""SELECT * from auth_user where id = %s""", [1])
    row = cursor.fetchone()

  (2)extra 

    Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
    Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
    Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
    Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

  (3)raw   

    models.UserInfo.objects.raw('select * from xxx')
    name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
    Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)

2.在建表时重写save方法,

  def save(self, *args, **kwargs):
    if not self.coupon_valid_days or (self.valid_begin_date and self.valid_end_date):
      if self.valid_begin_date and self.valid_end_date:
        if self.valid_end_date <= self.valid_begin_date:
          raise ValueError("valid_end_date 有效期结束日期必须晚于 valid_begin_date ")
      if self.coupon_valid_days == 0:
        raise ValueError("coupon_valid_days 有效期不能为0")
      if self.close_date < self.open_date:
        raise ValueError("close_date 优惠券领取结束时间必须晚于 open_date优惠券领取开始时间 ")

      super(Coupon, self).save(*args, **kwargs)   #再执行父类save方法

     这样,可以对表中valid_begin_date和valid_end_date字段在保存之前先判断一下是否符合要求

3.only和defer

4.select_related和prefetch_related(和性能相关)

 

posted @ 2018-03-16 22:13  星雨5213  阅读(92)  评论(0)    收藏  举报