>

美洲杯在线投注_2019美洲杯外围投注[投注官网]

热门关键词: 美洲杯在线投注,2019美洲杯外围投注[投注官网]

【Python3.6 Django2.0 Xadmin2.0系列教程之三(入门篇

- 编辑:美洲杯在线投注 -

【Python3.6 Django2.0 Xadmin2.0系列教程之三(入门篇

上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧。

第二篇我们来学习模型的建立。


模型

  • Django模型Models是与数据库相关的,与数据库相关的代码一般写在models.py中。
  • Django数据库操作采用ORM方式,从建表到增删改查都不需要直接操作数据库

 

初始化操作

  1. Alt R 打开Django命令行模式

    图片 1

    django_models.png

  2. 输入命令syncdb,先自动生成已有模块的表(配置INSTALLED_APPS中的模块)。
    中间会让你生成superuser账号,输入yes。然后再依次输入Username,Email,Password即可。

    图片 2

    django_models2.png

这是我们发现我们的`db.sqlite3`已经有许多自动生成的表。  

![](https://upload-images.jianshu.io/upload_images/1745406-27de92a457ea021c.png)

django_models3.png
  1. 完成数据库初始化。

1、上传图片/文件等资源

创建第一个模型

  • 一个模型对应的是数据库中的一张表。

  • 找到demo模块下的models.py编写第一个模型。

      from django.db import models
    
      class Students(models.Model):
          id = models.AutoField(verbose_name=u'ID', primary_key=True)
          name = models.CharField(verbose_name=u'姓名', max_length=255)         free = models.BooleanField(verbose_name=u'免费', default=True)
          score = models.IntegerField(verbose_name=u'评分', default=0)
          SEXS = {
              (0, u'男'),
              (1, u'女')
          }
          sex = models.SmallIntegerField(verbose_name=u'性别', default=0, choices=SEXS)
          TYPES = {
              (1, '初级'),
              (2, '中级'),
              (3, '高级')
          }
          type = models.IntegerField(verbose_name=u'类型', default=1, choices=TYPES)
          birthday = models.DateTimeField(verbose_name=u'生日')
          photo = models.ImageField(verbose_name=u'照片', upload_to='img')
          description = models.TextField(verbose_name=u'介绍', blank=True, null=True)
          ctime = models.TimeField(verbose_name=u'创建时间', auto_now_add=True)
    

    下面我们慢慢分析其中的内容。

  • class Students(models.Model)

    • 定义了一个学生模型,继承models.Model类,实际中就是对应了数据库中的一张学生表。
  • id = models.AutoField(verbose_name=u'ID', primary_key=True)

    • id变量定义了一个数据表中的id字段
    • models.AutoField定义了字段类型,这里是自增长类型
    • 参数verbose_name是该字段的显示名,在前端显示时就不会显示原始字段名
    • 参数primary_keyTrue定义了这个字段是主键,默认为False
    • 这样就定义了我们Students表的第一个字段,主键自增长ID
    • 这个主键自增长ID基本都不需要写,当模型中没有主键时,系统会自动帮你生成加上这个字段。
  • name = models.CharField(verbose_name=u'姓名', max_length=255)

    • models.CharField => 字符串类型
    • 参数max_length定义了字符串长度255
    • name => 姓名 字符类型 长度255
  • free = models.BooleanField(verbose_name=u'免费', default=True)

    • models.BooleanField => 布尔类型
    • 参数default定义了该字段的默认值True
    • free => 是否免费 布尔类型 默认值True
  • score = models.IntegerField(verbose_name=u'评分', default=0)

    • models.IntegerField => 数字类型
    • score => 评分 数字类型 默认值0
  • sex = models.SmallIntegerField(verbose_name=u'性别', default=0, choices=SEXS)

    • models.SmallIntegerField => 小数字类型

    • 参数choices定义了一个可选择范围SEXS

        SEXS = {
            (0, u'男'),
            (1, u'女')
        }
      

      0代表男,1代表女

    • sex => 性别 小数字类型 默认为男

  • type = models.IntegerField(verbose_name=u'类型', default=1, choices=TYPES)

    • type => 类型 数字类型 默认为初级
  • birthday = models.DateTimeField(verbose_name=u'生日')

    • models.DateTimeField => 时间类型(对应Python的datetime类型)
    • birthday => 生日 时间类型
  • photo = models.ImageField(verbose_name=u'照片', upload_to='img')

    • models.ImageField => 图片类型
    • 参数upload_to定义了图片上传的文件夹
    • photo => 照片 图片类型 上传文件夹img
  • description = models.TextField(verbose_name=u'介绍', blank=True, null=True)

    • models.TextField => 文本类型
    • 参数blank为True定义了字段允许为空值,默认为False
    • 参数null为True定义了空值将会被存储为NULL,默认为False
    • 默认情况下,字段都是不允许为空值的,只有设置后才可以
    • description => 介绍 文本类型 允许为空值 空值存为NULL
  • ctime = models.TimeField(verbose_name=u'创建时间', auto_now_add=True)

    • models.TimeField => 时间类型(对应Python的time类型)
    • 时间类型还有models.DateField(对应Python的date类型)
    • 参数auto_now_add为True定义了添加时自动写入添加时间
    • ctime => 创建时间 时间类型 添加时自动写入添加时间

有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方便教学管理。

数据库生成

  • 已经创建好了模型,下一步我们就可以用模型生成数据库。
  • Django的数据库不需要我们手动去建表,而是直接根据模型生成的
  • 模块初始化:

    1. 输入命令schemamigration demo --initial,其中demo是模块名,来初始化自定义模型。

      图片 3

      django_models1.png

      • 完成后会在demo文件夹下生成migrations文件夹,这个文件夹就是记录数据库信息的。
      • 现在下面就只有0001_initial.py这个文件夹,代表了刚才所做的数据库结构操作。
      • 每次对数据库结构的操作都会表现在后续的xxxx_xxx.py的文件中,稍后就会根据最后的.py文件来对数据库进行修改。
    2. 输入命令migrate demo,其中demo是模块名,这步就会生成表到数据库了。

      图片 4

      django_models4.png

    3. 查看数据库就有了demo_students这张表。

      图片 5

      django_models5.png

  • 修改数据库结构:

    1. 修改models.py,比如添加一个字段

       remark = models.CharField(verbose_name=u'备注', max_length=255)
      
    2. 输入命令schemamigration demo --auto,demo是模块名。

      图片 6

      django_models6.png

      • 此时出现了一个选择项,因为我们新加了一个字段,但数据库中已有的数据需要给新加的字段赋一个默认值。

      • 处理方式1:选择选项1退出。修改remark,增加一个default属性。

          remark = models.CharField(verbose_name=u'备注', max_length=255, default='')
        

        再执行刚才的命令,就可以了。

        图片 7

        django_models7.png

      • 处理方式2:选择选项2,直接给已存在的数据赋一个值。

    3. 完成上面的命令后,在migrationgs里就生成了一个0002_auto__add_field_students_remark.py文件。这个文件就对应了我们刚才对数据库结构的操作。

    4. 输入命令migrate demo,demo是模块名。

      图片 8

      django_models8.png

    根据刚才的`0002_auto__add_field_students_remark.py`文件,对数据库结构进行操作。

5.  查看数据库,就多了这个字段  

    ![](https://upload-images.jianshu.io/upload_images/1745406-25933f127c369d85.png)

    django_models9.png
  • 在Django中,我们不需要关心数据库的任何细节,就可以完成数据表的创建和修改。
  • 这里我们使用的Django版本是1.5,Django1.7以上版本的操作略有不同。

<h3 id="a64">关系数据类型</h3>

  • 前面我们已经了解了Django模型中的大部分的基础字段类型,如IntegerField。如果我们需要建立多张表,并且相互之间有关联,这时我们就需要建立多个关系模型。

  • Django将关系型数据库的关系统一成3种:外键、- 多对多一对一,对应的字段类型是ForeignKeyManyToManyFieldOneToOneField

  • 外键 => ForeignKey

    1. 创建班级Class模型

       class Class(models.Model):
           name = models.CharField(verbose_name=u'名称', max_length=64)
      
    2. Students模型添加班级外键

       cls = models.ForeignKey(Class, verbose_name=u'班级')
      
      • models.ForeignKey => 外键
      • 第一个参数Class就是班级模型,说明cls这个字段和Class模型是外键的关系。
    3. 命令行修改数据库结构。
      注:Class模型的定义必须在Students之前,不然会报没有找到Class的错误。

    4. 查看数据库

      • 增加了demo_class表

        图片 9

        django_models11.png

      • demo_students表中就加入了下面的字段。

        图片 10

        django_models10.png

  • 多对多 => ManyToManyField

    1. 同外键,先创建一个学科Subject模型

       class Subject(models.Model):
           name = models.CharField(verbose_name=u'科目', max_length=64)
      
    2. Studetns模型添加多对多关系

       subject = models.ManyToManyField(Subject, verbose_name=u'学科')
      
      • models.ManyToManyField => 外键
      • 第一个参数Subject就是学科模型,说明subject这个字段和Subject模型是多对多的关系。
    3. 命令行修改数据库结构。

    4. 查看数据库

      • 增加了demo_subject表

        图片 11

        django_models12.png

      • demo_students表没有变化

      • 增加了demo_students_subject表(中间表)
        ![](https://upload-images.jianshu.io/upload_images/1745406-17e3af23ee30b452.png)

        django_models13.png

5.  这里我们看到Django在处理多对多时,中间表都已经帮我们生成好了。让我们可以更纯粹的去处理业务。
  • 一对一 => OneToOneField

    1. 创建一个ID卡模型

       class IDCard(models.Model):
           number = models.CharField(verbose_name=u'卡号', max_length=30)
           student = models.OneToOneField(Students, verbose_name=u'学生')
      
      • models.OneToOneField => 一对一
      • 第一个参数Stuednts就是学生模型,说明student这个字段和Students模型是一对一的关系。
    2. 命令行修改数据库结构

    3. 查看数据库

      • 增加了demo_idcard表

        图片 12

        django_models14.png

首先,对demo/urls.py文件进行改造,给urlpatterns添加static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT):

小结

�HelloDjango第二篇介绍了模型的建立,可以看到Django的数据库ORM框架非常完善,开发人员完全不会直接接触到数据库。下面我们也即将开始学习数据库的操作,用起来也非常爽。

urlpatterns = [
    path(r'', xadmin.site.urls),
]   static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

然后在demo/settings.py文件中添加

# 指定上传位置
LOCATION = os.path.join('/', 'Users', 'babybus')

# 媒体文件根目录
MEDIA_ROOT = os.path.join(LOCATION, 'Media')

ROOT_URL = '/'

MEDIA_URL = '/media/'

 

上传图片涉及到路径的获取,在models.py文件中导入os模块

import os

在models.py文件的Students类中添加一个路径获取的方法及models.ImageField字段:

def get_photo(self, filename):
    return os.path.join('photo', '%s_%s_%s_%s' % (self.class_name, self.name, self.id, os.path.splitext(filename)[1]))

photo = models.ImageField(verbose_name='照片', upload_to=get_photo, blank=True, null=True)

同时同步一下数据库操作,这样页面就多出一个照片上传的选项了,选择好照片并保存:

图片 13

 

2、筛选、过滤、排序

1)筛选

今年学校的录取率爆满,生源特别好,要在一个数据库中找到对应的学生,必然需要用到搜索功能。

修改adminx.py文件,在StudentsAdmin类中添加:

search_fields = ('name', )

图片 14

 

要是我们想通过班级或者学科来查找这个班级或者选修这门学科的所有学生,方法还会是一样的吗?我们先试试:

search_fields = ('name', 'class_name', 'subjects',)

结果,报错了:

图片 15

这是怎么回事呢?原来,我们搜的“班级”和“学科”这两个字段一个是外键一个是含有多对多关系,Student模型中的这两个字段名称并不是其实际名称,要在字段后加“__”两个下划线,然后再添加外键或多对多关系实际的字段名:

search_fields = ('name', 'class_name__class_name', 'subjects__name',)

图片 16

现在妥妥的了。

2)过滤:

本文由计算机教程发布,转载请注明来源:【Python3.6 Django2.0 Xadmin2.0系列教程之三(入门篇