欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django学习之四:Django Model模块

程序员文章站 2022-05-29 13:32:35
Django Model模块 [TOC] model 模型 是映射数据库的表模型。通过操作model类及其实例对象,对数据库的表和记录进行相关操作。 MODEL需要在脑子里记住的基础概念 每一个model都是django.db.models.Model的子类。 每一个model的属性代表一个数据库的 ......

目录

django model模块

model 模型 是映射数据库的表模型。通过操作model类及其实例对象,对数据库的表和记录进行相关操作。

model需要在脑子里记住的基础概念

  • 每一个model都是django.db.models.model的子类。
  • 每一个model的属性代表一个数据库的一个字段。
  • 遵照以上两点,django会自动为model生成database-acesss数据库访问api

class meta 内嵌元数据定义类

用于自定义一些model设置

class somemodel(models.model):
    pass
    class meta:
        db_table = cust_tablename  # 自定义的映射数据库的表名;一般用自动生成的。
        abstract = false|true  # 定义该model 类是不是一个抽象类。

简单model创建实例

from django.db import models

class author(models.model):
    name = models.charfield(max_length=32)
    age = models.smallintegerfield()

    def __str__(self):
        return self.name

数据源配置

利用pymysql作为访问mysql数据源的驱动

  1. 在项目目录的__init__.py中添加以下代码:
import pymysql
pymysql.install_as_mysqldb()
  1. 通过其它数据库管理工具,在数据库中创建好库。然后配置数据库:
databases = {
    'default': {
        'engine': 'django.db.backends.mysql',
        'name': 'proj01',
        'user': 'zjq',
        'password': '123456',
        'host': '127.0.0.1',
        'port': '3306',
    }
}

# 'default'是必须设置的 

这样我的mysql数据源就配好了。

接着通过models在数据库中创建映射的表

命令行执行:

  1. python manage.py makemigrations [app_label [app_label...]] # 创建migrations文件
  2. python manage.py sqlmigrate app_label migration_name # 用于打印指定migration文件会执行的sql,sql不会同步执行到数据库中,只起到查看作用。
  3. python manage.py migrate [app_label] [ migration_name]

field class

model class 定义的field属性就是对应数据库表中的字段。model class中定义的属性所绑定的是一个匹配数据库字段类型的field class实例.
field实例类型决定了以下东西:

  1. 数据库column字段类型。
  2. 决定了默认的html widget对象,这个是用在model-forms中的。
  3. 最小限度的校验约束,用于在django's admin 页面 和 在 自动生成的model-forms中。

field options:field对象实例化参数

每种field 都有自己的特定的参数,参考官方文档

每种field也有共同相同的参数:

  • null 默认是false
  • blank 默认是false
    特别注意区别null和blank;null是数据库层面的限制;blank是model层面有关校验;
  • choices 是一个可迭代的由二元元组组成的数据类型(如list,tuple等),作为该字段限制的取值集合作用;二元元组中的第一个是数据库字段中存的值,第二个主要用于form表单中展示;相当于第一个字是value,第二个值是展示。使用了choices参数,字段对应的html widget将是select box,而不再是text input。通过model实例获取展示值使用get_fieldname_display()获取
    Django学习之四:Django Model模块

  • default 设置默认值,可以是value或者callable object.
  • primary_key 设置为主键;主键是只读的,如果修改只会去创建一个新的记录。

model表示表关系

  • many-to-many: manytomanyfield; 也可以自己递归引用。通过through可以给多对多关系添加额外数据字段,这种利用的就是中间人model方式。关于中间人model参见https://docs.djangoproject.com/en/2.1/topics/db/models/#extra-fields-on-many-to-many-relationships;使用了中间人model,就不能通过many-to-many的add(),create(),set(),remove()去创建关系了。因为额外数据不能通过多对多field来创建。只能通过中间人model去创建了 但是clear是可以用的,用于删除所有关系。通过中间人model的基于下划线的查询是不受影响的。
  • one-to-one: onetoonefield; 和下面的foreignkeyfield类似。
  • many-to-one : foreignkeyfield;外键引用不一定是其它表,可以自己递归,引用自己的字段,这样可以表示出树形关系。

model.objects

objects是model class 最重要的属性,它是一个manager,是查询操作的接口。

有关model继承

参见《django orm继承关系》,后面我会在我本地整理好后更新到博客。

有关通过model进行查询操作

参见《django model making queries》,后面我会在我本地整理好后更新到博客。

关于filefield 和 imagefield 字段类型类

因为model涉及到文件的这两个字段,数据库中是不最好不存文件对象,只能存一个文件的相对路径(实质就是相对于settings.media_root的配置根路径). 该文件字段对象提供了丰富的api来获取文件对象,获取文件路径,获取文件相关信息等。这就是数据库model文件字段和文件管理的映射就依靠:media_root+media_url+models.filefield值 建立起映射,从而提供给api使用,这样就可以通过model的filefield对象访问到用户上传到的文件。
主要api有:

  1. model_obj.filefield 是获取到文件对象,将会是和下面的model_obj.filefield.name值相同,是定义字段时的upload_to加上文件名。
  2. model_obj.filefield.name 是获取存在数据库中的值,就是相对路径(相对于根目录)
  3. model_obj.filefield.path 是获取到path,文件系统中的绝对路径。
  4. model_obj.filefield.url 是获取url,是通过media_url设置的url能访问到的路径。如:/media/avatars/default.png。 这里一定要区分path和url的区别,path是文件系统中的路径概念,可以是相对可以是绝对,而url是网络资源路径不是和path一一对应的。

初始化filefield需要一个upload_to参数:

class mymodel(models.model):
    # file will be uploaded to media_root/uploads  // media_root是配置文件设置的filesystem的绝对路径。
    upload = models.filefield(upload_to='uploads/')
    # or...
    # file will be saved to media_root/uploads/2015/01/30
    upload = models.filefield(upload_to='uploads/%y/%m/%d/')

upload_to 参数也可以是一个可执行的,只要返回一个包含文件的路径;如果是可执行的对象,那么这个可执行就需要返回一个完整的文件名和路径,因为filefield将会用这个可执行对象返回的作为这个字段的值,这时候;这个给upload_to赋值一个路径字符串不同,后者会将字符串做为路径,将赋值的文件对象的名字和路径作为数据库中该字段对应的值。

还有一个filefield参数是storage 一个django的存储引擎对象,这个对象是handle存储和检索文件的引擎。
在获取到一个model对象后,给其filefield对象赋值文件路径字符串也可以。

filefield 和 field file

前者是一个field类,后者是一个file类,是一个file文件对象。

当访问前者时,会得到一个后者实例。注意:在使用create_user方法创建model对象时,对应的filefield参数传入的是一个uploadedfile对象,但是从前者获的field获取值是,是得到的一个fieldfile对象。两个对象是相似但是不同的:相同的是都是文件对象,都是包裹了相同的文件stream,不同是的两者对外的api不同,两者获取的名字很可能是不同的,因为django会在创建model时,如果存在相同文件名,会修改新加如的文件名,避免文件冲突的。所以上传的文件名,存入django media_root目录后,文件名字可能是会被修改的。后者file对象还有了url路径,提供给外界访问用户上传文件资源的url。

现在清楚了,filefield牵扯到了 存储对象,文件对象,系统配置media_root,至于media_url是给反查url或者获取url api用的。

django系统给了一个serve view函数,来提供访问用户的上传文件和系统的静态文件的功能。这个函数需要两个参数,一个文件的path,和文件的path相对的root路径。

还有一个uploadedfile 对象,这个对象就是form表单post上来的文件对象。对象api参考: