Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Django学习总结(三) #63

Open
PyxYuYu opened this issue Dec 8, 2016 · 0 comments
Open

Django学习总结(三) #63

PyxYuYu opened this issue Dec 8, 2016 · 0 comments
Labels

Comments

@PyxYuYu
Copy link
Owner

PyxYuYu commented Dec 8, 2016

Life is a test and this world a place of trial.

0x01 Django

  • Django Blog 学习总结
    • Django Tips
      • models.py 数据模型
        • 数据模型存在于 app 中,也就是说如果牵扯到了数据库,那么一般情况都会创建 app ,一个 project 可以包含多个 app ,技术上,project 的作用是提供配置文件(定义数据库信息, app 列表等),一个 app 就是一套 Django 功能的集合,通常包括模型和视图, app 很容易移植到其他 project 和被多个 project 复用
        • 每个数据模型都是 django.db.models.Model 的子类,它的父类 Model 包含了所有必要的和数据库交互的方法,并提供了一个简洁的定义数据库字段的语法
        • 每个数据模型(一个类)都相当于一个数据库表,每个属性就是表的一个字段,属性名就是字段名,它的类型就是数据库的字段类型
          • 比如 title = models.CharField(max_length=150) 其中 CharField 相当于 varchar
        • 每个数据模型(一个类)对应一个数据库表也存在例外的情况
          • 多对多关系 : 会自动创建一个关联表, ManyToManyField
          • 一对多关系(反过来就是 多对一 ): ForeignKey
          • 举个例子:学生和班级的关系(多对一,也就是一对多),学生和课程的关系(多对多)
            from django.db import models
            
            class Classes(models.Model):
                cls_num = models.CharField(max_length=30)
            
            class Student(models.Model):
                name = models.CharField(max_length=100)
          	  # 一对多的关系,一个班级多个学生,ForeignKey
          	  cls_num = models.ForeignKey(Classes)
            
            class Course(models.Model):
                # 多对多的关系,每个学生可以有多个课程,一个课程也可以多个学生
          	  c_num = models.ManyToManyField(Student)
        • 每个 app 需要在 settings.py 文件中加载,写在 INSTALLED_APPS 中,不要忘记 Django 中元组元素后面的 逗号
        • models.py 编辑完后,此时数据模型没有同步到数据中,同步数据库需要 2 个步骤
          • makemigrationsmigrate 命令
          • python manage.py makemigrations
            • 用于根据数据模型文件的变更,创建出新的迁移脚本,这些脚本文件都存放在 migrations 文件夹内
          • python manage.py migrate
            • 将上面的迁移脚本,执行同步至数据库中
        • 同步到数据库中,自动生成的表名是 app 名称和模型的小写名称的组合, Django 会为每个表格自动添加一个 id 主键,可以重新设置它, Django 也会添加 _id 后缀到外键字段名,通用这个也可以自定义
        • 所有的数据模型都自动拥有一个 objects 属性,也被称为 objects 管理器,每个管理器管理着所有针对数据包含、还有最重要的数据查询的表格级操作,查找数据的时候就会使用到 objects
          • 比如: Post.objects.all() 查询数据库中所有 posts 对象,虽然这个对象看起来像列表,但是它实际上是一个 QuerySet (查询集)对象,这个对象是数据库中一些记录的集合
          • Post.objects.filter(xxx='aaa') 利用 filter() 方法可以对数据进行过滤,可以同时传递多个参数到 filter() 来缩小选取范围
            • 这里的 filter(xxx='aaa') 是精确匹配, SQL 缺省的 = 操作符是精确匹配(缺省就是默认的意思)
            • 其他类型的查找可以用 __ 双下划线来连接一些特定的匹配
              • Post.objects.filter(xxx__contains='aaa') : contains 就是 LIKE
              • 类似的还有 icontains(大小写无关的 LIKE)、startwithendwithrange
          • Post.objects.get(xxx='aaa') 上面的 filter() 获得的是一个查询集,查询集就是一个 QuerySet,这里的 get() 获取的就是单个对象,而不是 QuerySet ,如果返回的结果是多个对象或者没找到都会抛出异常
          • Post.objects.order_by('xxx') 利用 order_by() 来对检索结果排序,不同于 all() 的是这个是有排序的检索
            • 逆向排序的话,在前面加一个减号 - 前缀
            • 多个字段排序的话,使用多个参数就可以了,先按第一个字段排序,第一个字段相同的情况下,按第二个字段排序
            • Django 可以指定缺省排序方式,即不用每次使用 order_by() 来进行排序(字母顺序排序),利用 class Meta: ,也就是 Meta 类,可以在任意一个数据模型类中使用 Meta 类,除非检索时指定了使用 order_by() ,否则都用 Meta 类指定的排序
               class Post(models.Model):
                   # ...
               class Meta:
                   ordering = ('-aaa',) # 注意元组元素后面的逗号
          • 通常我们需要同时进行过滤和排序查询的操作,这样就是连锁查询 :
            • Post.objects.filter(xxx='aaa').order_by('yyy')
          • 利用 Python 的列表裁剪语法,可以限制返回的数据:
            • Post.objects.order_by('xxx')[0]
            • Post.objects.order_by('xxx')[0:2]
            • 注: 不支持 Python 的负索引,但是可以用倒排序来实现
              • Post.objects.order_by('-xxx')[0]
          • 更新数据库中的数据,如果使用 save() 方法会默认更新这个一行中的所有列(即其他列不变),但是有些情况下,只需要更新指定的列,其他的不更新,这个时候使用 update() 方法
            • Post.objects.all().update(xxx='bbb')
            • update() 方法会返回一个整型数值,表示受影响的数据条数
          • 删除数据库中的数据,使用 delete() 方法
            • 删除所有数据时,需要先用 all() : Post.objects.all().delete()
            • 删除指定数据时,先用 filter() 或者 get()
      • django.contrib
        • django.contrib 是一套庞大的功能集,它是 Django 基本代码的组成部分,其中又有以下主要的几部分
          • django.contrib.auth : 用户鉴别系统
          • django.contrib.sessions : 支持匿名会话
          • django.contrib.comments : 用户评论系统
          • django.contrib.admin : 管理系统
        • Django 有一个简单的管理后台系统,激活它之前需要同步数据库才可以(如果之前一次都没有同步过的话)
          • 激活之后需要帐号和密码,利用 python manage.py createsuperuser 创建超级用于
          • 忘记密码的话,利用 python manage.py changepassword username 来修改 username 的密码
@PyxYuYu PyxYuYu added the Django label Dec 8, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant