zoukankan      html  css  js  c++  java
  • Django学习小记-ORM操作概要1

    其实许多web框架都是用的pymysql来连接控制数据库,但Django还提供了ORM的数据库操作办法(本质也是pymysql);两种方式皆可,但我们有必要去学一下ORM

    • 不再关注用的是mysqloracle...等.
    • 通过简单的配置就可以轻松更换数据库, 而不需要修改代码.

    ORM操作:

      http请求:

        url -> 视图(模板+数据)

      ORM操作表:

        创建表、修改表、删除表

      操作数据行:

        增删改查

      ORM利用pymysql等第三方工具连接数据库

      默认sqlite

      默认:mysql -> MYSQLDB(修改django默认连接mysql的方式

    默认setting文件这样设置的:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

    我们需要修改成如下配置:

    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'dbname',
        'USER': 'root',
        'PASSWORD': 'xxx',
        'HOST': '',
        'PORT': '',
        }
    }

    # 如下设置放置的与project同名的配置的 __init__.py文件中

    # 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
    
    import pymysql
    pymysql.install_as_MySQLdb()

    要是出现这个bug这样修复-->  django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3

    总结准备步骤就是:

    1. 创建数据库
    2. 修改setting文件
    3. 修改__init__.py文件引入pymysql

     接下来创建一个类,让类给咱们生成表:

    在app01文件夹里的models.py修改:

    from django.db import models
    
    #创建表、列(id
    id...
    class UserInfo(models.Model):
        nid = models.BigAutoField(primary_key=True) #这行不写Django默认会自动创建id并且是自增主键,所以以后可以不用写这行了!
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)

    那如何让class给咱创建表呢?..再去setting里注册上app01:

    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01'
    ]
    View Code

    最后就要放大招:生成表!这两命令记在骨髓里!!!

    #要是你app里没有migrations文件先要生成下!
    #python manage.py makemigrations --empty app01
    
    python manage.py makemigrations
    python manage.py migrate

    看它一一下子除了我们自己的表还有很多表,这些表其实与Django自带的那个后台有关:

     此时,migrations文件夹下就生成相应配置文件,轻易不要删除哦~

    假如以后你想在class里修改表名,请直接修改,再执行一次“骨髓命令”就行!有数据也没关系!

    假如以后你想在加一列age = models.IntegeField(),直接加就行,但是....

    若原表中有数据了,只要指定age = models.IntegeField(null=True)或者age = models.IntegeField(default=xxx)

    若创建一对多等关系就例如 ug = models.ForeignKey("UserGroup",null=True)    #生成是外键 ug_id

    数据库相关操作:增删改查

    #test可删
    def test(requst):
        from app01 import models
        #新增
        models.UserInfo.objects.create(username='shannon',password='111111')
        #查找
        #userinfo QuerySet类型(列表)[obj,obj,obj]
        userinfo = models.UserInfo.objects.all()
        for row in userinfo:
            print(row.nid,row.username)
        #加条件的查找filter()
        # ,是and ; id__gt=1 是id大于1;id__lt=1 是id小于1
        userinfo = models.UserInfo.objects.filter(nid=2,username='shannon')
    
        #删除,删前得先找到~
        models.UserInfo.objects.filter(nid=1).delete()
    
        #更新
        models.UserInfo.objects.filter(nid=4).update(password='123')
    
        return HttpResponse('成功')

     ORM连表操作

    《models.py》
    from
    django db import models class UserType(models Model): #用户类型 title= models.CharField(max length=32) class UserInfo(models. Model): #用户表 name= models.CharField(max length=16) age= models.IntegerFieldo ut= models.ForeignKey(UserType)
    ------------------------------------------------
    #获取
    #QuerySet[obj,obj,obj] 是列表类型
    result =models.UserInfo objects.all()
    for obj in resylt:
      print(obj.name,obj.age,obj.ut_id,obj.ut.title)
      #其实Django帮你做了连表


    QuerySet[obj,obj,obj] 是列表类型

    #UserInfo, ut是FK字段 - 正向操作 (一个用户只有一个用户类型)

    #UserInfo ,表名小写_set.all() - 反向操作 (一个用户类型下可以有很多用户)

     

    【Django】 让models 里面的内容正序或倒序显示?

    问题描述
    在进行django开发过程中,对app的内容进行更新,发现更新的内容显示在文末,没有显示在开头,期望所有的内容根据更新时间倒序显示

    解决方法
    问题很好解决,我们只需要在models里面添加如下代码:

    class Gally(models.Model):
    title = models.CharField(max_length=50, verbose_name='标题')
    create_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
    
    class Meta:
    ordering = ('-create_time',)

     即可实现通过create_time 倒序排列,当然你也可以

    ordering = ('-id',)  也就是最新的显示在最前面。

    如果要正序,也很简单,去掉create_time 的 ‘-’ 符号就可以了
    ————————————————
    当然,还有一种简单的方法:直接在查询后面加order_by

    user_list = models.UserInfo.objects.all().order_by('id')
    #倒序:
    user_list = models.UserInfo.objects.all().order_by('-id')
    #多个排序条件,先左后右原则
    user_list = models.UserInfo.objects.all().order_by('id','name')

    ethtool

    为美好的生活奋斗!
  • 相关阅读:
    队列<一>
    二叉树的遍历[先序,中序,后序]
    The method format(String, Object[]) in the type String is not applicable for the arguments
    sqlserver 备份 与 还原
    sqlserver 无法获得数据库独占权
    page.isvalid
    bzoj3994 [SDOI2015]约数个数和
    bzoj4868 [Shoi2017]期末考试
    bzoj1179 [Apio2009]Atm
    bzoj4869 [Shoi2017]相逢是问候
  • 原文地址:https://www.cnblogs.com/ethtool/p/12171368.html
Copyright © 2011-2022 走看看