ORM之基本操作增删改查

ORM之基本操作增删改查

  在函数前,先导入要操作的数据库表模块,model

  from model所在的路径文件夹 import model

 在views文件中,加的路径:

#就一个app01功能的文件,在app01的文件下,在app01的views里加
from app01 import model
#在有路由分发的项目中:AutoCMDB项目里的集成所有的功能的apps文件里找到具体的功能包。
from apps.cases import model

增操作:(create) 

def index(request):
    model.UserGroup.objects.create(tilte='销售部')
    #在UserGroup表中添加title值销售部     
    model.UserInfo.objects.create(username='george',password='123',usergroup_id=1)
   #在UserGroup表中添加username,password,age,ug_id

查操作:(all、filter)

def index(request):
  group_list = model.UserGroup.objects.all()
  #将UserGroup表的所有数据拿到,起别名group_list。
  group_list = model.UserGroup.objects.filter(id=1)
  #将UserGroup表的所有数据拿到,过滤id=1的值,并放入别名group_list中。
  group_list = model.UserGroup.objects.filter(id__gt=1)
  #将UserGroup表的所有数据拿到,过滤id大于1的值,并放入别名group_list中。
   group_list = model.UserGroup.objects.filter(id__lt=1)
  #将UserGroup表的所有数据拿到,过滤id小于1的值,并放入别名group_list中。
def index(request):
    group_list = models.UserGroup.objects.all()
    print(group_list) # 这个列表是一个QuerySet类型的列表,里面是一个个的对象,用for循环可以取到里面的值。
    #可以循环group_list里的数据,因为拿到的是列表。
    for row in group_list:
        print(row.id,row.title)

删操作:(delete)

def index(request):
    model.UserGroup.objects.filter(id=2).delete()
  #将UserGroup表中的id=2的那列数据删除 

改操作:(update)

def index(request):
    model.UserGroup.objects.filter(id=2).update(title='技术部')
    #将UserGroup表中的id=2的那列的title的值改为技术部

 其他操作:

  排序操作:.order_by( )

  view的函数:

def testtest(request):
    """
    排序操作
    :param request:
    :return:
    """
    user_list = models.UserInfo.objects.all()
    user_list1 = models.UserInfo.objects.all().order_by("id")   #order_by是排序,参数是字段,比如加id字段,会按正序排列,从小到大
    user_list2 = models.UserInfo.objects.all().order_by("-id")   #加负号会按倒序排列,从大到小
    user_list3 = models.UserInfo.objects.all().order_by("-id","name")   #如果id有重复的,那么就按name进行排序,也是按从小到大,如果name也叫负号,那么也是从大到小
    print(user_list)
    print(user_list1)
    return render(request,"index.html",{"user_list":user_list,"user_list1":user_list1})
View Code

  models的类:

class UserInfo(models.Model):
    name = models.CharField(max_length=255)
    age = models.IntegerField()
    ut = models.ForeignKey("UserType")

    def __str__(self):
        return "%s_%s" %(self.id,self.name)
View Code

  分组操作:比如根据ut的id来进行分组,计算每组的人数。 annotate()

       但是分组是要加聚合条件的。

       from django.db.models import Count,Sun,Max,Min

   views的函数:

def testtest1(request):
    """
    分组操作
    :param request:
    :return:
    """
    from django.db.models import Count
    user_list = models.UserInfo.objects.values("ut_id").annotate(xxx=Count("id"))   # xxx就是个别名
    #这样会把ut_id一样的分为一类
    print(user_list.query) #用.query是打印查看user_list生成的SQL语句    

   生成的SQL语句:

   如果是加条件的话views函数是:

def testtest1(request):
    """
    分组操作
    :param request:
    :return:
    """
    from django.db.models import Count
    user_list = models.UserInfo.objects.values("ut_id").annotate(xxx=Count("id")).filter(xxx__gt=2)
    #这样依旧可以加条件,条件的参数可以写实例中的别名大于2的值,在SQL中就是having操作。
  
   print(user_list.query) #用.query是打印查看user_list生成的SQL语句
   return HTTPResponse("...") 

   加filter条件的SQL:

  filter 在前和在后是不一样的,在前的话或找不到xxx别名的参数,但他可以找到Count("id") 的id。

  filter 在前表示是where条件。filter前后都有,就先进行一次筛选出需要的数据,在进程分组,最后在进行一次筛选。

def testtest1(request):
    """
    分组操作
    :param request:
    :return:
    """
    from django.db.models import Count

    user_list = models.UserInfo.objects.filter(id__gt=2).values("ut_id").annotate(xxx=Count("id")).filter(xxx__gt=2)
    #第一个filter先进行id大于2的筛选,然后在根据ut_id进行分组,分完组根据Count 的id 进行大于2的筛选。
    print(user_list.query) #用.query是打印查看user_list生成的SQL语句

  其他操作:

    models.UserInfo.objects.filter(id__lte=1) # lte和gte 分别是小于等于和大于等于
    models.UserInfo.objects.filter(id__gte=1) # lte和gte 分别是小于等于和大于等于
    models.UserInfo.objects.filter(id__in=[1,2,3]) # in 就必须传一个列表, 这是条件id在1,2,3里面的
    models.UserInfo.objects.filter(id__range=[1,3]) # range是一个范围
    models.UserInfo.objects.filter(name__startswith="xxx")
    models.UserInfo.objects.filter(name__contains="xxx") #包含xxx的数据

    #exclude是排除,除它以外的。
    models.UserInfo.objects.exclude(id=1) # id不等于1
1. 增
    create(name='xx',age='xx'.....)
    dic={name"xxx,age}
    create(**dic)
        
2. 更新
    models.xx.objects.filter(id=1).update(a=1,b=2)
            
    models.xx.objects.filter(id=1).update(**dic)
        
3. 查询
    models.xx.objects.filter(id=1,xxx)
    models.xx.objects.filter(**{'id':1,'name':'alex'})
            
PS: Django帮助我们数据转换 -> 字典  =》 Form组件(用户请求规则验证+数据字典)

 select_related 和 prefetch_related:

        ====================================================
        # q = models.UserInfo.objects.all()
        # select * from userinfo
        # select * from userinfo inner join usertype on ...
        # for row in q:
        #     print(row.name,row.ut.title)

       # select_related: 查询主动做连表
         q = models.UserInfo.objects.all().select_related('ut','gp')
        # select * from userinfo
        # select * from userinfo inner join usertype on ...
         for row in q:
             print(row.name,row.ut.title)

       # prefetch_related: 不做连表,做多次查询
         q = models.UserInfo.objects.all().prefetch_related('ut')
        # select * from userinfo;
        # Django内部:ut_id = [2,4]
        # select * from usertype where id in [2,4]
         for row in q:
             print(row.id,row.ut.title)
        
        ====================================================
        class Boy(models.Model):
            name = models.CharField(max_length=32)

        class Girl(models.Model):
            nick = models.CharField(max_length=32)

        class Love(models.Model):
            b = models.ForeignKey('Boy')
            g = models.ForeignKey('Girl')
       
=====================================================
# 1. 和george有关系的姑娘 # obj = models.Boy.objects.filter(name='george').first() # love_list = obj.love_set.all() # for row in love_list: # print(row.g.nick) # # # love_list = models.Love.objects.filter(b__name='george') # for row in love_list: # print(row.g.nick) # # love_list = models.Love.objects.filter(b__name='george').values('g__nick') # for item in love_list: # print(item['g__nick']) # # love_list = models.Love.objects.filter(b__name='george').select_related('g') # for obj in love_list: # print(obj.g.nick) 1. ManyToManyField
        可以创建一个第三张表
2. 自定义关系表 3. 杂交 class Boy(models.Model): name = models.CharField(max_length=32) m = models.ManyToManyField('Girl',through="Love",through_fields=('b','g',)) # 查询和清空 class Girl(models.Model): nick = models.CharField(max_length=32) # m = models.ManyToManyField('Boy') class Love(models.Model): b = models.ForeignKey('Boy') g = models.ForeignKey('Girl') class Meta:
            """
            联合唯一索引:unique_together 使b和g的相同的id组合只能出现一次
            """ unique_together
= [ ('b','g'), ]

  

  关于更多models操作,借鉴url:www.cnblogs.com/wupeiqi/articles/6216618.html 

 -------------- END ------------

  

原文地址:https://www.cnblogs.com/george92/p/8506073.html