zoukankan      html  css  js  c++  java
  • day-62Django

    ORM自己写的多对多

                models.py:
                            class Boy(models.Model):
                                name = models.CharField(max_length=32, null=True)
    
                            class Girl(models.Model):
                                nick = models.CharField(max_length=32, null=True)
    
                            class Love(models.Model):
                                b = models.ForeignKey("Boy", null=True)
                                g = models.ForeignKey("Girl", null=True)
                                
                                class Meta:
                                    unique_together = [                         #联合唯一索引的方法
                                        ('b',  'g')
                                    ]
                        views.py:
                       
                        
                            #1. 查询和 勾洋 约会的 姑娘
                             res = models.Boy.objects.filter(name='勾洋').first()
                             
                            # ### 反向查询 love中的相亲记录
                             love_list = res.love_set.all() 
                            ## <QuerySet [<Love: Love object>, <Love: Love object>]>
                            
                             for obj in love_list:
                            # ### 正向查询 girl表中的nick
                                 print(obj.g.nick)
    
                            #2.查询和 勾洋 约会的 姑娘
                             res = models.Love.objects.filter(b__name='勾洋').all()                        
                             #<QuerySet [<Love: Love object>, <Love: Love object>]>
                             
                             for obj in res:
                                 print(obj.g.nick)
    
                            # 3.查询和 勾洋 约会的 姑娘
                            res = models.Love.objects.filter(b__name='勾洋').values("g__nick")
                            
                            #filter相当于where,也就是b__name是条件
                            #values相当于select后面的,是查的结果,也就是g__nick 显示的是对方表的数据
    

    ORM自动生成的多对多

               通过 ManyToManyField() 来生成第三张表,但是只能生成两个字段(boy_id 和 girl_id)
    models.py:
    class Boy(models.Model): name = models.CharField(max_length=32, null=True) g = models.ManyToManyField('Girl', null=True) class Girl(models.Model): nick = models.CharField(max_length=32, null=True) views.py: #添加 obj = models.Boy.objects.filter(name='谢增城').first() #找到名字为谢增城的对象 print(obj) ### Boy object obj.g.add(3) #在第三张表中以谢增城的id添加一条姑娘的id(也就是3) #添加多个 obj.g.add(*[1,2]) 添加姑娘id为1和2 #重置 obj.g.set([4]) #在第三张表中谢增城id对应姑娘的id全变为4 #查询 obj = models.Boy.objects.filter(name='谢增城').first() res = obj.g.all() print(res) ## <QuerySet [<Girl: Girl object>, <Girl: Girl object>, <Girl: Girl object>]> for obj in res: print(obj.nick) #查的是Girl表中谢增城对应的姑娘 #删除 obj = models.Boy.objects.filter(name='谢增城').first() obj.g.clear() #删除第三张表谢增城所有记录

    ORM高级查询

            print(res.query)查询sql语句
                #1. in(id为1,2,3)
                 res = models.UserInfo.objects.filter(id__in=[1,2,3])
                
    
                #2. not in(id除了1,2,3的所有)
                res = models.UserInfo.objects.exclude(id__in=[1,2,3])
            
    
                #3. like(name是列名)
                #where name like 'ze%'            以ze开头的所有的数据
                #startswith:                     以 某单词开头
                #istartswith :                    以 某单词开头 忽略要查的大小写
                
                 res = models.UserInfo.objects.filter(name__startswith="ze")
                 res = models.UserInfo.objects.filter(name__istartswith="ze")
            
    
                #where  name  like '%ze'
                #endswith :                       以 某个单词结尾
                #iendswith:                       以 某单词结尾 忽略要查大小写
                 res = models.UserInfo.objects.filter(name__endswith='ze')
    
                #where name like "%ze%"
                #contains :                         包含某一个单词
                #icontains:                         包含某一个单词 忽略要查大小写
                # models.UserInfo.objects.filter(name__contains='ze')
    
                # 4. between.. and..(id 1到2)
                models.UserInfo.objects.filter(id__range=[1,2])
    
                #5. limit (就是切片)
                 models.UserInfo.objects.all()[开始位置:结束位置]
                 models.UserInfo.objects.all()[0:10]
                 models.UserInfo.objects.all()[10:20]
    
                #6. order by
                 res = models.UserInfo.objects.all().order_by('id')        
                 # 以id默认升序
                
                 res = models.UserInfo.objects.all().order_by('-id','name')
                 #前面加一个 ‘-’ 代表 降序,上面这个是先按id降序,出现相同在按name升序
    
                #7. group by
                 from django.db.models import Count, Max, Min, Sum
                 res = models.UserInfo.objects.values('name').annotate(xxx=Count('id'))
                 #以name进行分组,以id进行分组的依据,xxx是为id取得别名
            #如果还要进行二次筛选(having)后面.filter
    # SELECT "app01_userinfo"."id", COUNT("app01_userinfo"."name") AS "xxx" # FROM "app01_userinfo" # GROUP BY "app01_userinfo"."id"; #8. only: 只取某一个列的值(值里包含id,可以和valuve进行对比) # SELECT "app01_userinfo"."id", "app01_userinfo"."name", "app01_userinfo"."age" FROM "app01_userinfo" res = models.UserInfo.objects.only('name', 'age').all() # <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>, #<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]> #9. defer: 除了这几列之外的所有列的值(之外的值怎么写都会包含id那一列) # SELECT "app01_userinfo"."id", "app01_userinfo"."ut_id" FROM "app01_userinfo" res = models.UserInfo.objects.defer('id','name', 'age').all() #10.using: 想要使用哪个数据库, 就将这个数据库的配置名称(配置字典前面的名称)写到using中 #注意,models中需要有模型表 models.UserInfo.objects.all().using("xxxx") #11. 表中总共多少条数据 res = models.UserInfo.objects.count() #12. 拿第一条数据 res = models.UserInfo.objects.first() # 13.拿最后一条数据 res = models.UserInfo.objects.last() # 14.gt lt res = models.UserInfo.objects.filter(id__gt=3) > res = models.UserInfo.objects.filter(id__gte=3) >= res = models.UserInfo.objects.filter(id__lt=3) < res = models.UserInfo.objects.filter(id__lte=3) <= # 15. and操作 res = models.UserInfo.objects.filter(id=1, name='zekai') # 16.or操作 from django.db.models import Q res = models.UserInfo.objects.filter( Q(Q(id=1) | Q(name='zekai')) & Q(name='xxxx') ) # 先前面or,在和后面and # 17. 在原来的基础数据上更新值 from django.db.models import F models.UserInfo.objects.update(age = F('age') + 1) #18.原生sql(不如pymysql) from django.db import connection cursor = connection.cursor() cursor.execute("select * from app01_userinfo where id=%s", [1,]) res = cursor.fetchall() res = cursor.fetchone() #19. 原生sql models.UserInfo.objects.raw('select * from app01_userinfo') 注意: 1. orm能实现的功能, 尽量使用orm实现 2. 不建议大家以后再自己的业务逻辑中, 混着用

     

    插入多条数据 :
      obj = [
        models.UserInfo(name='zekai', age=12, ut_id=2),
        models.UserInfo(name='xxxxx', age=13, ut_id=2),
        models.UserInfo(name='dsadsa', age=14, ut_id=1),
        models.UserInfo(name='gfdgfdg', age=24, ut_id=2),
        models.UserInfo(name='tretre', age=45, ut_id=3),
        models.UserInfo(name='gfdgfd', age=42, ut_id=2),
      ]


      models.UserInfo.objects.bulk_create(obj)

    xss攻击

    全称:

      跨站脚本(js)攻击
    原因:
      用户输入的内容不可控
    案例:
      <script>1.获取用户的cookie 2. 发送这个cookie到黑客的数据库</script>

      views.py:
                   
                msg = []
                def comment(request):                            黑客页面
                    if  request.method == 'GET':
                        return render(request, "comment.html")
                    else:            
                        comment = request.POST.get('comment')
                        msg.append(comment)
                        return render(request, "comment.html")
                 
                def  show(request):                              用户页面
                    return render(request, 'show.html', {"msg":msg})
            
        comment.html:
                <form action="/comment/" method="post">
                    <input type="text" name="comment">
                    <input type="submit" value="提交">
                </form>
            
        show.html:
                    <ul>
                        {% for item in msg %}
                            <li>{{ item | safe }}</li>    | safe认为用户传的都是安全的  
                        {% endfor %}
                    </ul>

    补充:

      ut = models.ForeignKey("UserType", null=True, on_delete=models.CASCADE(默认))
      CASCADE: 设置级联删除(子删,关联的父也会删除)
      SET_NULL : 取消级联删除

     

      'ud__name'=xxx(神奇的双下划线)这个正向查询在.filter也可以用,表示跨表查询限制条件

      'ud__name'这个正向查询在.values中,表示跨表要查哪一列

  • 相关阅读:
    Linux常用命令
    ServerSocketChannel和SocketChannel
    Java扫描包
    [BZOJ3874/AHOI2014]宅男计划
    [BZOJ4029/HEOI2015]定价
    [考试]20151012贪心
    [BZOJ4027/HEOI2015]兔子与樱花
    [考试]20151010
    [考试]20151009
    Test of String
  • 原文地址:https://www.cnblogs.com/klw1/p/11198385.html
Copyright © 2011-2022 走看看