zoukankan      html  css  js  c++  java
  • python-day68--模型层基础(model)

    一、ORM : object relationship mapping   对象映射关系

    映射关系:

         表名  <-------> 类名
    
           字段  <-------> 属性
    
        表记录 <------->类实例对象
    

    二、创建表(建立模型)     必须是先创建表,再启动项目

    class Book(models.Model):
    
        nid = models.AutoField(primary_key=True)
        title = models.CharField( max_length=32)
        publishDate=models.DateField()
        price=models.DecimalField(max_digits=5,decimal_places=2)
        keepNum=models.IntegerField()
     Book(nid=2,title='alex传',publishDate='2017-10-25',price='100.22',keepNum=2)    #实例化对象就是在Book表中添加 记录

    创建数据库的两条命令:

      python manage.py makemigrations     #app01(应用中的migrations文件夹中会生成一个文件)这是第一步:翻译,把你写的类中的信息进行调整,对应
        python manage.py migrate          #这是第二步 :是把sql语句执行,所有的表才会生成

    注意1:.sqlite3 数据库会自动创建数据库,不需要提前创建,直接启动项目就可以了

    注意2:使用mysql数据库时,在第一步创建库的时候django会报错,那是因为django默认按mysqldb执行,但是在python3版本中,没有mysqldb,只有pymysql,故: 在应用(app01)下面的__init__.py中需配置一下:

    import pymysql
    
    pymysql.install_as_MySQLdb()

    然后再执行创建数据库的命令。

    注意3:更换mysql数据库时需要在settings中更改设置

     #把 sqlite3数据库有关 信息 注释掉
    # DATABASES = {                   
    #     'default': { 
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    
    
    DATABASES = {
    
        'default': {
    
            'ENGINE': 'django.db.backends.mysql',
    
            'NAME': 'blog',    #你的数据库名称
    
            'USER': 'root',   #你的数据库用户名
    
            'PASSWORD': '', #你的数据库密码
    
            'HOST': '', #你的数据库主机,留空默认为localhost
    
            'PORT': '3306', #你的数据库端口
    
        }
    
    }

     补充:在settings文件中通过logging的设置可以查看翻译成的sql语句

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level': 'DEBUG',
            },
        }
    }
    View Code

    三、添加表记录

    1.普通字段:  推荐使用方式2

    方式1  :类的实例化,需要save
    publish_obj=Publish(name="人民出版社",city="北京",email="renMin@163.com")
    publish_obj.save() # 将数据保存到数据库
    
    方式2    返回值publish_obj是添加的记录对象  ,不需要save 
    publish_obj=Publish.objects.create(name="人民出版社",city="北京",email="renMin@163.com")

    四、修改表记录

    # 修改方式1:save(效率低)
            book_obj=models.Book.objects.filter(nid=id)[0]
            book_obj.title="金平"
            book_obj.save()
          #效率低是因为不管你是不是修改一个字段的值,django都会重新把所有的字段值赋值一遍。
    
    # 修改方式2: 推荐使用
    models.Book.objects.filter(nid=1).update(title='title',author='author',publishDate='pubDate',price='price')

    五、删除表记录

    models.Info.objects.filter(id=1).delete()
    models.Info.objects.get(id=1).delete()

    六、查询表记录

    1.查询相关API

    <1> all():                 查询所有结果
     
    <2> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象,可以多个条件,在括号内用逗号隔开
     
    <3> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                               如果符合筛选条件的对象超过一个或者没有都会抛出错误。
     
    <5> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象
     
    <4> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                               model的实例化对象,而是一个可迭代的字典序列
     
    <9> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
     
    <6> order_by(*field):      对查询结果排序
     
    <7> reverse():             对查询结果反向排序
     
    <8> distinct():            从返回结果中剔除重复纪录
     
    <10> count():              返回数据库中匹配查询(QuerySet)的对象数量。
     
    <11> first():              返回第一条记录
     
    <12> last():               返回最后一条记录
     
    <13> exists():             如果QuerySet包含数据,就返回True,否则返回False
        查询方法API:
    
    
        1  all: models.表名.objects.all()
        
        book_all=models.Book.objects.all()  # 结果是querySet集合    [model对象,....]
        print(book_all) # <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
        
        2 filter: models.表名.objects.filter() # 结果是querySet集合    [model对象,....]
        
        ret1=models.Book.objects.filter(author="yuan") # # <QuerySet [<Book: 追风筝的人>, <Book: asd>]>
        ret2=models.Book.objects.filter(nid=1) # <QuerySet [<Book: yuan>]>
        ret2=models.Book.objects.filter(author="yuan",price=123) # <QuerySet [<Book: yuan>]>
        print(ret2)
        
        3 get  models.表名.objects.get()   # model对象
        
        ret3=models.Book.objects.get(author="yuan")
        print(ret3.price)
        
        
        4 exclude : 排除条件
        ret4=models.Book.objects.exclude(author="yuan")
        print(ret4)
        
        5 values方法
        ret=models.Book.objects.filter(author="yuan").values("title","price")
        print(ret)# <QuerySet [{'title': '追风筝的人', 'price': Decimal('99.00')}, {'title': 'asd', 'price': Decimal('123.00')}]>
        
        6 values_list方法
        ret = models.Book.objects.filter(author="yuan").values_list("title", "price")
        print(ret) # <QuerySet [('追风筝的人', Decimal('99.00')), ('asd', Decimal('123.00'))]>
        
        7 distinct方法
        ret=models.Book.objects.filter(author="yuan").values("author").distinct()
        print(ret)
        
        8 count方法
        ret=models.Book.objects.filter(author="yuan").count()
        print(ret)
        
        9 first 方法
        ret = models.Book.objects.all().first()
        print(ret)
        
        10 exists方法
        if models.Book.objects.all().exists():
            print("exists")
        else:
            print("nothing")
    API例子

    注意:一定区分object与querySet的区别 !!!

    2.双下划线之单表查询

    models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
     
    models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
    models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
     
    models.Tb1.objects.filter(name__contains="ven")
    models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
     
    models.Tb1.objects.filter(id__range=[1, 2])      # 范围bettwen and
     
    ret=models.Book.objects.filter(price__gt=100)   #大于
    ret=models.Book.objects.filter(price__gte=99) # 大于等于
    
        ret=models.Book.objects.filter(publishDate__year=2017,publishDate__month=10)    #2017年10月
    
    ret=models.Book.objects.filter(author__startswith="")
    
    
    startswith,istartswith, endswith, iendswith 
  • 相关阅读:
    css笔记图
    C#基础(四)条件、循环和判断
    C#基础(三)引用类型和预定义值类型
    C#基础(二)变量和常量
    C#基础(一)
    jquery实现全选和取消全选
    jquery easyUI datagrid自动计算两列的值
    纯CSS竖直菜单
    easyui被activeX控件挡住的解决方法
    jquery实现WIN7本地磁盘容量条效果
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/7731837.html
Copyright © 2011-2022 走看看