当前位置 : 主页 > 编程语言 > python >

python框架Django中MTV之Model(数据模型)

来源:互联网 收集:自由互联 发布时间:2022-06-15
MTV框架之Model(数据模型) 关注公众号“轻松学编程”了解更多。 1、连接MySQL数据库 项目中的settings.py设置范例 # 配置数据库 DATABASES = { 'default' : { # 数据库引擎 'ENGINE' : 'django.db.backends.


MTV框架之Model(数据模型)

关注公众号“轻松学编程”了解更多。

1、连接MySQL数据库

项目中的settings.py设置范例

# 配置数据库
DATABASES = {
'default': {
# 数据库引擎
'ENGINE': 'django.db.backends.mysql',

# 数据库名称
'NAME': 'axf',

# 账号和密码
'USER': 'root',
'PASSWORD': '123456',

# IP和端口
'HOST': 'localhost',
'PORT': '3306'
}
}

项目中的init.py导入pymysql

import pymysql
pymysql.install_as_MySQLdb()

2、ORM

  • ObjectRelationalMapping=对象关系映射
  • 将具体语言下的【数据及其结构(通常以类表示)】映射为数据库的【表结构和数据】
  • 在Django中,一旦数据结构发生变化,就需要重新进行数据迁移

3、数据迁移操作

方法一:在Terminal窗口输入:

  • python manage.py makemigrations 生成数据迁移py文件
  • python manage.py migrate 执行数据迁移

方法二、在工具栏Tools->Run manage.py Task…窗口输入:

  • makemigrations 生成数据迁移py文件
  • migrate 执行数据迁移

python框架Django中MTV之Model(数据模型)_数据

4、数据定义

  • 数据类型
  • 整型:models.IntegerField(default=1)
  • 浮点型:models.FloatField(default=0)
  • 字符串: models.CharField(max_length=32, unique=True)
  • 长文本:models.TextField(db_column=‘ps’)
  • 大文本字段,一般超过4000使用
  • 布尔型:models.BooleanField(default=False)
  • 带空值布尔型:NullBooleanField
  • 支持null、true、false三种值
  • 日期时间:models.DateTimeField(auto_now=True)
  • 使用Python的datetime.datetime实例表示的日期和时间
  • 若auto_now=True,每次保存对象时,自动设置该字段为当前时间
  • 若auto_now_add=True,当对象第一次被创建时自动设置当前时间(一次性的时间戳)
  • 注意:auto_now_add, auto_now,default三者是互斥的
  • 其它字段类型
  • 带小数点:DecimalField(max_digits=None, decimal_places=None)
  • 使用python的Decimal实例表示的十进制浮点数
  • max_digits=总位数
  • decimal_places=小数位数
  • 日期:DateField([auto_now=False, auto_now_add=False])
  • 使用Python的datetime.date实例表示的日期
  • 时间:TimeField
  • 使用Python的datetime.time实例表示的时间
  • 主键:a_id = models.AutoField(primary_key=True)
  • 一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中
  • 文件:FileField
  • 上传文件字段
  • 图像:icon = models.ImageField(upload_to=‘icons’)
  • 继承于FileField,框架对上传的对象进行校验,确保它是个有效的image
  • 表关系字段(外键)
  • 字段约束
  • primary_key=False
  • django会为表增加自动增长的主键列
  • 如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
  • max_length=None
  • unique=False
  • null=False
  • 如果为True,则默认以空值NULL填充
  • blank=False
  • 如果为True,则该字段允许为空白(即空字符串),这个约束常常用于表单验证
  • default=NOT_PROVIDED
  • db_index=False
  • 若值为 True, 则在表中会为此字段创建索引
  • db_column=None
  • 字段的名称,如果未指定,则使用属性的名称
  • 完整约束源码
    ​​class Field(RegisterLookupMixin): def __init__(self, verbose_name=None, name=None, primary_key=False, max_length=None, unique=False, blank=False, null=False, editable=True, serialize=True, unique_for_date=None, unique_for_month=None, unique_for_year=None, choices=None, help_text='', db_column=None, db_tablespace=None, auto_created=False, validators=(), error_messages=None): ​​​
  • 元信息
  • class Meta:
  • db_table = ‘Flower’ #放在模型中,自定义生成的表名
  • ordering = ["-f_color"] #放在模型中,对表进行默认排序
  • 这是一个 tuple 或一个字符串列表. 每个字符串是一个字段名带及一个可选的前缀 “-” , 这个前缀表示按降序排序(递减). 若没有这个前缀,则表示按升序排序.字符串 “?” 表示随机排序.
  • 范例:用户定义
    ​​# 用户数据模型 class UserModel(models.Model): # 用户名密码邮箱 username = models.CharField(max_length=32, unique=True) password = models.CharField(max_length=256) email = models.CharField(max_length=64, unique=True) # False 代表女 sex = models.BooleanField(default=False) # 头像,图片字段,上传到静态资源文件夹下的icons/ icon = models.ImageField(upload_to='icons') # 是否被逻辑删除 is_delete = models.BooleanField(default=False) class Meta: #定义表名为t_user db_table = "t_user" ​​

5、数据查询

  • 查询语法
  • XXX.objects.all()
  • XXX.objects.get(k1=v1,k2=v2)
  • 过滤器
  • XXX.objects.filter(条件语句)
  • XXX.objects.exclude(条件语句)
  • 过滤器
  • filter(条件语句):获取符合条件的
  • exclude(条件语句):去除不符合条件的
  • 条件语句
  • 格式
  • 格式1:属性名=值(忽略大小写)
  • 格式2:属性名__运算符=临界值
  • 运算符
  • gt
  • lt
  • gte
  • lte
  • startswith
  • 大小写敏感
  • endswith
  • contains
  • exact
  • istartswith
  • i=忽略大小写
  • iendswith
  • icontains
  • iexact
  • 缓存的二次筛选
  • 查询时允许多个过滤器串联使用(链式调用)
  • 只有第一次会执行数据库查询,后续操作是对已有结果集的筛选
  • Q对象:实现复杂条件
  • Q(条件语句) & Q(条件语句)
  • 条件与
  • Q(条件语句) | Q(条件语句)
  • 条件或
  • ~ Q(条件语句)
  • 条件非

6、表关系

  • 一对一(OneToOneField)
    • 将关系字段定义在任意一方
      • Person-IDCard
        一张身份证对应着一个人
      • 从表IDCard持有外键
    • 一访问一
      • 格式:对象.模型类小写
      • idcard = person.idcard
  • 一对多(ForeignKey)
    • 将关系字段定义在多方
      • Person-Hobby
      • 多方Hobby持有外键
    • 一访问多
      • 格式:对象.模型类小写_set
      • hobbies = person.hobby_set
  • 多对多(ManyToManyField)
    • 将关系字段定义在任意一方
      • Buyer-Goods
      • 从表Goods声明关联关系
    • 多a访问多b
      • goods.g_buyers.add(buyer)
      • buyers = goods.g_buyers.all()
      • goods_list = buyer.goods_set.all()
  • on_delete
    • 定义删除对象时如何处理其级联数据(其外键/关系字段指向的数据)
    • 可选值
      • models.CASCADE
        • 默认值,默认删除级联数据
      • models.PROTECT
        • 不存在级联数据的时候允许删除
        • 当存在级联数据的时候删除会抛出保护异常
      • models.SET_NULL
        • 级联数据赋值为空
      • models.SET_DEFAULT
        • 前提是字段本身有默认值
      • models.SET()
        • 删除的时候重新动态指向一个实体
  • 维护表关系思路
    • 在从表中添加关系字段,其类型即为【对方对象(或对象容器)】
    • 框架自动为主表添加对应的关系字段,其类型即为【对方对象(或对象容器)】
      • .对方类名,IDE会自动提示可用的属性

7、Manager

  • 显式属性/隐式属性
  • 显式属性
  • 开发者手动定义的,直接看的到的
  • 隐式属性
  • 系统/框架根据需求,自动创建的对象
  • objects是model.Manager对象
  • 当我们手动创建了Manager对象的时候,它就不会自动生成了
  • 好处:配置默认的数据创建方式和查询方式
  • 创建类并指定管理器
    ​​class Dog(models.Model): d_name = models.CharField(max_length=16) d_legs = models.IntegerField(default=4) is_delete = models.BooleanField(default=False) # 交由管理器进行管理 d_manager = MyManager() ​​
  • 定义管理器类
  • class MyManager(models.Manager):
  • 定义创建实例方法
    ​​ # 创建狗的实例,默认两条腿 def create_model(self,d_name, d_legs = 2): dog = self.model() dog.d_name = d_name dog.d_legs = d_legs return dog ​​
  • 定义查询方法
    ​​ # 默认不包含被逻辑删除的狗狗 # 先调用model.Manager get_queryset def get_queryset(self): return super(MyManager,self).get_queryset().exclude(is_delete=True) ​​​
  • 使用管理器类
  • 创建实例
  • dog = Dog.d_manager.create_model(“中国田园犬”)
  • 查询实例
  • dogs = Dog.d_manager.all()
  • dogs = Dog.d_manager.all().filter(is_delete=False)
  • dogs = Dog.d_manager.filter(d_legs__lt=100)
  • dogs = Dog.d_manager.filter(Q(d_legs__lt=20)|Q(d_legs__gt=150))

8、继承

  • 定义父类
  • 案例:动物
    ​​# 动物父类 class Animal(models.Model): #名字和腿数 a_name = models.CharField(max_length=16, default='Animal') a_legs = models.IntegerField(default=4) class Meta: #表名是抽象的,框架不会为当前类创建表 abstract = True ​​
  • 定义子类
  • 案例:狗狗
    ​​# 动物子类狗狗 class Dog(Animal): #已经有了a_name和a_legs #定义自己独有的字段 d_fun = models.TextField() ​​

9、常用API

  • 查询
  • flowers = Flower.objects.all()
    flowers = Flower.objects.all().order_by("-id")[0:2]
    flowers = Flower.objects.filter(f_color__gt=100).filter(f_color__lt=150)
    flowers = Flower.objects.filter(f_color__gt=100).exclude(f_color__gt=150).filter(f_name__contains=“水”)
    flowers = Flower.objects.filter(f_name__endswith=“1”)
    flowers = Flower.objects.filter(f_name=“rose”)
    flowers = Flower.objects.filter(pk__in=[1,2,3,4])
    flowers = Flower.objects.filter(f_time__year=“2019”)
    students = Student.objects.filter(s_grade_id__gt=F(‘id’)-5)
    ----------
    flower = Flower.objects.get(pk=10)
    flower = Flower.objects.get(f_color=255)
    ----------
    flower = flowers.last()
    flower = flowers.first()
    if flowers.count() == 0:
    if flowers.exists():
    ----------
    dogs = Dog.objects.filter(~Q(d_legs__lt=100))
  • 插入
  • grade = Grade()
  • grade.g_name = ‘fuck’
  • grade.save()
  • ----------
  • person = Person.objects.create(p_name=“小黄%d”%random.randrange(110))
  • p = Buyer.objects.create(b_name=“清醒%d下” % flag)
  • goods = Goods.objects.create(g_name=“娃娃%d” % flag, g_price=flag)
  • 删除
  • 通过查询得到一个特定的grade对象
  • grade.delete()
  • 修改
  • 通过查询得到一个特定的grade对象
  • grade.gname=‘shit’
  • grade.save()

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

公众号

python框架Django中MTV之Model(数据模型)_条件语句_02

关注我,我们一起成长~~


上一篇:Django中间件(Middleware)处理请求
下一篇:没有了
网友评论