06_django的模型系统的基本使用

1. 配置django使用MySQL数据库

  1. 在项目要目录下修改settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',       # 要使用的数据库类型
        'NAME': 'crm',          # 使用的数据库名称
        'UsER': 'root',         # 数据库用户
        'PASSWORD': 'qwe123',   # 数据库密码
        'HOST': '127.0.0.1',    # ip
        'PORT': 3306            # 端口
    }
}
  1. 修改(编辑)项目文件夹(和settings.py 文件所在的目录)下的__init__.py 文件
# 写上下面的两句话    # 环境中要先安装pymysql   pip install pymysql
import pymysql
pymysql.install_as_MySQLdb()

2. 模型的创建和激活

  1. 创建 app目录下的models.py
from django.db import models
# 一个模型类对应数据库中的一张表, 类属性代表表中的字段
class Students(models.Model):    # 每个模型都是 django.db.models.Model 的子类
    name = models.CharField(max_length=16)   # 类属性
    age = models.SmallIntegerField(default=0)   # 年龄  默认 0 即 没有填写
    sex = models.SmallIntegerField(default=1)   # 性别, 默认为1 即 男
    qq = models.CharField(max_length=20, default='')
    phone = models.CharField(max_length=20, default='')  # 默认 = '' 空, 没有填写的
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)   # 创建时间
    update_time = models.DateTimeField(verbose_name='更新时间', auto_now=True)

    def __str__(self):
        return 'name: %s, age: %s, sex: %s' % (self.name, self.age, self.sex)

  1. 激活
   2. 运行数据库迁移命令[可以指定哪个app要进行数据库迁移命令]: python manage.py makemigrations [app_name]
   3. 执行迁移: python manage.py migrate  [app_name]    # python manage.py sqlmigrate [app_name] 0001 查看sql语句

3. 使用 (对数据库中表的增删改查)

  1. 在view.py视图函数中使用
from django.http import HttpResponse
from .models import Students   # 导入创建的模型类

def add(request):
    """向表中添加数据"""
    # 方法一: 
    long1 = Students(name='long', age=18)
    long1.save()

    # 方法二    与方法一算同一个方法
    long2 = Students()
    long2.name = 'long2'
    long2.save()

    # 方法三
    Students.objects.create(name='long3', age=20)    # 不管有没有这条数据都会增加
    # 方法四
    Students.objects.get_or_create(name='long4')  # 先从数据库中查找这条数据,如果没有则增加,如果有则不增加
    
    return HttpResponse('add添加数据')


def select(request):
    """向表中查找数据"""
    #  1. 模型类.object.get()   # 只能查找一条数据,如果有多条数据满足,则会报错
    res = Students.objects.get(id=2)   # Students.objects.get(pk=2)   如果不确定id是主键,可以用pk 代替, pk 一定是

    # 2. 模型类.objects.filter()  查找满足条件的所有数据, 如果不写条件, 则默认查找所有数据,与 模型类.objects.all() 作用一样
    res2 = Students.objects.filter(age=18)  # 查找 age = 18 的所有数据

    # 3. 模型类.objects.all()    # 查找所有数据
    res3 = Students.objects.all()

    return HttpResponse('select 查看数据')


def update(request):
    """修改 更新数据"""
    # 把需要更新的数据查找出来
    res = Students.objects.get(id=3)   # 查找出需要更新的这一条数据
    res.name = 'new_name'   # 修改name
    res.age = 23
    res.save()  # 保存更新

    # 修改多个
    # 把 age = 18 的数据全部更新为 name = 'longdongcheng', age = 22
    Students.objects.filter(age=18).update(name='longdongcheng', age=22)

    # 把 表中所有数据的 name 修改为 yanyan
    Students.objects.all().update(name='yanyan')
    return HttpResponse('update 更新数据')


def delete(request):
    # 也是把需要删除的数据先查询出来
    Students.objects.get(id=1).delete()   # 删除id=1 的一条数据
    Students.objects.filter(age=0).delete()  # 删除 age=0 的所有数据
    Students.objects.all().delete()   # 删除表中的所有数据
    return HttpResponse('delete 删除表中的数据')
  1. 在 python manage.py shell 中使用 # 建议中用ipython,如果安装了ipython, 则默认会使用ipython进入 (# 与在视图中的使用是一模一样的)
(django2.1) pyvip@VIP:~/django_code/orm_model$ python manage.py shell
Python 3.6.6 (default, Sep 12 2018, 18:26:19) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.5.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from test_model.models import Students 

    ### 1. 增加数据                                  
In [2]: long = Students(name='long', age=18)  
In [3]: long.save()  # 方法一增加一条数据                                                                                                                       
In [5]: long2 = Students()
In [6]: long2.name = 'long2'
In [7]: long2.age = 19                                                         
In [8]: long2.save()    # 方法二增加数据, 相当于也是方法一,只是先实例了一下                    

In [9]: Students.objects.create(name='long3', age=20)   # 方法三增加数据,增加并返回这条数据
Out[9]: <Students: id: 14, name: long3, age: 20, sex: 1>

In [17]: Students.objects.get_or_create(name='long')   # 先查询这条数据,如果找到,则不创建,False
Out[17]: (<Students: id: 12, name: long, age: 18, sex: 1>, False)
In [18]: res = Students.objects.get_or_create(name='long4')  # True, 这条数据在表中不存在,创建
In [19]: res 
Out[19]: (<Students: id: 17, name: long4, age: 0, sex: 1>, True)


### 2. 查询数据
# 1. .objects.all() 查询表中的所有数据
In [20]: res = Students.objects.all()                                          
In [21]: for i in res: 
    ...:     print(i) 
    ...:                                                                          
id: 12, name: long, age: 18, sex: 1
id: 13, name: long2, age: 19, sex: 1
id: 14, name: long3, age: 20, sex: 1
id: 15, name: long3, age: 20, sex: 1
id: 16, name: long3, age: 20, sex: 1
id: 17, name: long4, age: 0, sex: 1

In [22]:         

# 2. .objects.get()   # 查询一条数据, (没有, 有多个匹配都会报错)
In [25]: Students.objects.get(id=12)                                   
Out[25]: <Students: id: 12, name: long, age: 18, sex: 1>

# 3. .objects.filter()  # 查询所有满足条件的数据
In [26]: Students.objects.filter(age=18)
Out[26]: <QuerySet [<Students: id: 12, name: long, age: 18, sex: 1>]>
# filter不写条件就与.all() 一样,查询所有的数据
In [30]: res = Students.objects.filter()                                       
In [31]: for i in res: 
    ...:     print(i) 
    ...:                                                                        
id: 12, name: long, age: 18, sex: 1
id: 13, name: long2, age: 19, sex: 1
id: 14, name: long3, age: 20, sex: 1
id: 15, name: long3, age: 20, sex: 1
id: 16, name: long3, age: 20, sex: 1
id: 17, name: long4, age: 0, sex: 1

In [32]:     
原文地址:https://www.cnblogs.com/nichengshishaonian/p/11091002.html