zoukankan      html  css  js  c++  java
  • django学习第六天---shell指令,单表基于双下划线的模糊查询,distinct注意点,字段的choices属性,url反向解析,orm多表操作创建表

    shell指令

    • 命令
          python manage.py shell
          在Terminal,执行上面这个指令会进入到python解释器环境中,并且加载了我们当前django项目配置环境,所以可以在当前shell使用django内部的功能,如
          from app01 import models
          models.Book.object.all();
          或者直接在Python Console里面使用上述代码也可以
    

    基于双下划线的模糊查询

          from app01 import models
          def book(request):
                #都是返回QuerySet类型
                models.Book.objects.filter(price__in=[100,200,300])#price值等于这三个里面存在的所有QuerySet类型对象
                示例:
                ret = models.Book.object.filter(price__in=['20.11','30.11',])#针对decimal字段要用字符串 返回所有符号列表数据的QuerySet对象
                ret = models.Book.object.filter(price__in=[20,18])#针对float或者int类型要用数字
                ret = models.Book.object.filter(price__gt=100)#大于
                ret = models.Book.object.filter(price__gte=100)#大于等于
                ret = models.Book.object.filter(price__lt=100)#小于
                ret = models.Book.object.filter(price__lte=100)#小于等于
                ret = models.Book.object.filter(price__range=[100,200])#大于等于100,小于等于200
    
                #针对一些字符串数据操作
                #找到包含某些字符串的数据
                ret = models.Book.objects.filter(title__contains='python')#title值中包含python返回<QuerySet [<Book: python>, <Book: cpython>]> QuerySet类型
                ret = models.Book.objects.filter(title__icontains='python')#不区分大小写
                
                #找到以某些字符串开头或者结尾的数据
                models.objects.filter(title__startswith='py')#以什么开头
                models.objects.filter(title__istartswith='p')#不区分大小写以什么开头
                models.objects.filter(title__endswith='py')#以什么结尾
                models.objects.filter(title__iendswith='p')#不区分大小写,以什么结尾
    
                #日期时间类型数据的操作 返回QuerySet类型
                #按照年份查 下面两种写法都正确
                models.Book.objects.filter(pub_date__year=2012)
                models.Book.objects.filter(pub_date__year='2012')
    
                #某年某月的
                models.Book.objects.filter(pub_date__year=2012,pub_date__month=7)
                #查看某年某月某日
                models.Book.objects.filter(pub_date__year=2012,pub_date__month=7,pub_date__day=12)
                #只查某月
                models.Book.objects.fliter(pub_date__month=7)
    
                #查询某个字段为空的数据
                models.Book.objects.filter(title__isnull=True)#正规的
                models.Book.objects.filter(title=None)   
    

    查看某个orm语句的原生sql语句方法

          print(models.Book.objects.filter(title__isnull=True).query)
          原生sql语句如下
          SELECT `app01_book`.`id`, `app01_book`.`title`,             
          `app01_book`.`state`, `app01_book`.`price`, 
          `app01_book`.`price2`, `app01_book`.`pub_date`, 
         `app01_book`.`title2`, `app01_book`.`publish` FROM `app01_book`
          WHERE `app01_book`.`title2` IS NULL 
    

    distinct注意点

          class Book(models.Model):
                id = models.AutoField(primary_key=True) #自动,主键
                ...
                publish = models.CharField(max_length=32)
    
                def __str__(self):
                      return self.title +'价格' +str(self.price)
    
                def Meta:
                      ordering=['id','publish',]
    
          #views.py文件内容如下
          #models.py文件中制定了规则,此时用去重就不生效了
          obj_list = models.Book.objects.all().values('price2').distinct()
          print(obj_list)
          #打印结果<QuerySet [{'price2': 100}, {'price2': 200}, {'price2': 300}, {'price2': 200}, {'price2': 100}, {'price2':100}, {'price2':200}]>
          #配合order_by自定义规则 此时会去重
          obj_list = models.Book.objects.all().order_by('price2').values('price2').distinct()
        print(obj_list)#<QuerySet [{'price2': 100}, {'price2': 200},{'price2': 300}]>
          #当模型类中制定了默认排序字段,那么当我们使用distinct方法进行去重时,默认会按照我们指定的排序字典进行去重,会导致去重结果不是我们想要的,所以要么我们在模型类中不指定排序字段,如果制定了排序字段,我们在使用distinct方法前面加上order_by方法,并且order_by方法中的字段就是我们要去重的字段数据
    

    字段的choices属性

          class Book(models.Model):
                ...
                #sex = models.CharField(max_length=12)
                sex_choices = ((1,'男性'),(0,'女性'))#enum枚举 单选
                sex = models.IntegerField(choices=sex_choices,default=1)
    
          views.py文件内容
          获取含有choices属性的字典数据方法
          ret = models.Book.objects.get(id=5)
          print(ret.sex) #1  获取到的是数据库中存储的字段数据
          print(ret.get_sex_display()) #男性,能够帮我们获取到该字段数据对应的choices指定的元组中的这个数据对应的文本内容
    
          # sex_choices = ((1, '男性'), (0, '女性'))  # enum枚举 单选
          # sex = models.IntegerField(choices=sex_choices, default=1)
          # 比如拿sex这个字段来说,数据库中存的数据是1,表示男性,如果我想获取到男性这个字符串数据,我直接通过模型类对象.get_sex_display()这个方法就能获取到,这个方法的语法是get_模型类属性名称_display()
    

    auto_now_add和auto_now

          使用
          class ShowTime(models.Model):
                id = models.AutoField(primary_key=True)
                name = models.CharField(max_length=32)
                brithday = models.DateTimeField(auto_now_add=True)#添加记录时,自动添加创建时间
                bday = models.DateTimeField(auto_now=True)#添加记录时,也能自动添加创建时间,并且更新记录时,自动更新为当前时间
    
          操作:
          models.DateTimeField(auto_now=True)中的auto_now=True对update方法没有效果
          models.ShowTime.object.all().update(
                name='liu',      
                )
    
          auto_now=True只有在使用save方法来进行更新动作时,才生效,才会自动更新修改时间
          ret = models.ShowTime.objects.get(id=1)
          ret.name='liu'
          ret.save()
    

    url反向解析

    • 由于将来项目中的不同功能对应的url路径可能会发生变化,所以我们在每个url路径上加上一个别名,将来通过别名反向解析来使用这个别名对应的路径,那么不管路径将来发生什么变化,只要别名不变,那么逻辑中使用这个路径的地方,都可以通过别名获取到

    别名的使用

          urlpatterns=[
                ...
                url(r'^add_book/',views.add_book,name='add_book'),#name属性对应的值,就是这个路径的别名
          ]
    

    views视图中使用url反向解析的方法

          首先在视图中引入反向解析的方法
          from django.urls import reverse #url别名反向解析,通过name别名对应的数据,解析出我们的url路径
          1.针对没有参数的别名
          url(r'^add_book/',views.add_book,name='add_book')
          反向解析:reverse('book_list')
          2.针对含有无名分组的url
          url(r'^book_list/v2/(d+)/(d+)',views.book_list,name='book_list')
          反向解析:reverse('book_list',args=(11,12))
          3.针对含有有名分组的url      
          url(r'^book_list/v2/(?P<year>d+)/(?P<month>d+)/',views.book_list,name='book_list')
          反向解析:reverse('book_list',kwargs={'year':2012,'month':7})
    

    html文件中使用url别名反向解析

          1.针对无参数的路径:
          url(r'^add_book',views.add_book,name='add_book')
          反向解析:<a href="{% url 'add_book' %}">添加</a>
          2.针对有参数的路径:有名和无名
          url(r'^add_book/(d+)/(d+)/',views.add_book,name='add_book')
          url(r'^add_book/(?P<year>d+)/(?P<month>d+)/',views.add_book,name='add_book')
          反向解析:<a href="{% url 'add_book' 参数1 参数2 %}">添加</a>
    

    写作业时注意的点

          数据库中存储的日期,要在页面中input标签中显示原数据必须用过滤器date:'Y-m-d'
          <input type="date" class="form-control" id="book_pub_date" placeholder="出版日期" name="book_pub_date" value="{{ edit_obj.pub_date|date:'Y-m-d' }}">,type='date'的input标签,value的值必须是'Y-m-d'的格式,这个标签才能认识并被赋值,所以,要通过date过滤给它改变格式。
    

    orm多表操作

    表关系介绍

    • ER图,实体关系图,navicat和powdesigner工具可以研究下

    • 多表图创建

          from django.db import models
          class Author(models.Model):
                #作者表
                id = models.AutoField(primary_key=True)#其实模型类中的id主键字段不需要我们手动指定,django的orm默认会给每张表都添加一个id字典并且为主键,如果我们自己指定了主键,以我们自己指定的为准,就不会自动帮你添加主键字段了
                name = models.CharField(max_length=32)
                age = models.IntegerField()
                #关联外键完整写法
                #ad = models.ForeignKey(to='AuthorDetail',to_field='id',on_delete=models.CASCADE)
                #简写可以不写to=,不写to_field='id'
                #ad = models.ForeignKey('AuthorDetail',on_delete=models.CASCADE)#只是单纯的外键关系,需要手动指定唯一约束才可以,在orm中提供了一对一关系的类,叫作OneToOneField.
                ad = models.OneToOneField('AuthorDetail') #foreign+unique 外键+约束
                #books = models.ManyToManyField('Book')
    
                #models.ForeignKey(AuthorDetail)这里面的外键关联的表,可以不写引号,但是如果不写引号,那么这个外键关键的表必须写在这个外键字典的表上面,一般我们都写上引号,这样就不用考虑哪个表写在上面,哪个表写在下面了
                #ad = models.ForeignKey(AuthorDetail,on_delete=models.CASCADE)
                #第一个to=可以用写,to_field='id'也可以不用写,自动找到是to=那张表的id字段
                #django 1.11版本的foreignKey 默认有on_delete=models.CASCADE这个属性,所以如果要做这种级联删除模式,可以不用写这个属性,但是django2.0之后,必须要自己手动加上这个属性
          
          #关于联级()
          models.CASCADE 联级删除;#没办法设置联级更新,要做联级更新,自己通过原生sql去加上,就是修改表
    
    
          class AuthorDetail(models.Model):
                #作者详细信息表
                birthday = models.DateFiedl()
                telephone = models.CharField(max_length=24)
                #通过手机号查找默认 手机号151开头
    
          class Publish(models.Model):
                name = models.CharField(max_length=64)
                city = models.CharField(max_length=64)
    
          class Book(models.Model):
                title = models.CharField(max_length=64)
                pub_date = models.DateField()
                price = models.DecimalField(max_digits=10,decimal_places=2)
                pub = models.ForeignKey('Publish')
                #ForeignKey这个类,生成数据库字段的时候,会自动将该属性名称_id作为我们的数据库字段名称
                authors = models.ManyToManyField('Author')
                #authors在执行数据库同步指令之后,不会生成字段,而是会帮我们生成一个第三张表,这个表就是书籍表和作者表的多对多关系表 生成的第三表book_authors表
    

    -------------------------------------------

    个性签名:代码过万,键盘敲烂!!!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    sql server中的孤立用户
    BWOA开源项目引子
    海边拾贝
    ABAP syntax_error 错误: form send_cmplx_data_015 does not exist.
    一点总结,手机应用开发前景
    这个周末发生了很多事
    品味单反
    远图(FarMap)使用
    And和手机随想
    远图(FarMap)花絮
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/13342008.html
Copyright © 2011-2022 走看看