python_django_models模塊

django中models模塊爲各種數據庫提供了統一的api,可根據不一樣的業務需求配置數據庫。html

models模塊開發流程:python

  1. 配置數據庫  詳情:http://www.javashuo.com/article/p-ywkmzdfn-gv.html
  2. 定義模型類: 一個模型類在數據庫中對應一張數據表
  3. 生成遷移文件
  4. 執行遷移文件生成數據表
  5. 使用模型類進行增刪改查

這裏主要是介紹models模塊,那就不得不提到ORMmysql

ORM : 對象-關係-映射git

   

django中的增刪改查,在orm中轉換爲create/insert等語句再和各類數據庫進行交互,以後,在數據庫中獲得的數據集等在經過orm轉換爲python中的數據表sql

orm的任務:shell

  • 根據對象的類型生成表結構
  • 將對象、列表的操做轉換爲sql語句
  • 將sql語句查詢到的結構轉換爲對象、列表

優勢:
  減輕開發人員的工做量,不須要面對因數據庫的變動而修改代碼數據庫

一個模型類在數據庫中對應一張表,在模型類中定義的屬性,對應表中的一個字段django

from django.db import models
class Students(models.Model):      # 模型類
    # 字段
    id = models.AutoField(primary_key=True)  # 建立一個自增的主鍵字段
    name = models.CharField(null=False,max_length=20)  # 建立一個varchar(20)類型的name且不能爲空

django 會爲表增長自動給增加的主鍵列,每一個模型只能有一個主鍵列,若使用選項設置某屬性爲主鍵列後,則django不會再生存默認的主鍵列。api

屬性命名限制:1.遵循標識符規則 2.不容許連續的下劃線

 

字段類型:字段的建立session

AutoField

主鍵類型,一個根據實際id自動增加的integerField,一般不指定,若不指定,一個主鍵字段將自動添加到模型中

CharField(max_length = 字符長度) 字符串類型
TextField 大文本字段,通常超過4000使用,(顯示的是一個文本域)
IntegerField 整數類型
DecimalField(max_digits=None,decimal_places=None) 十進制浮點數類型

max_digits:位數總數
decimal_places:小數點後的數字位數

FloatField 浮點數類型
BooleanField true/false 字段,默認的表單控制室checkboxInput
NullBooleanField null/true/false
DateField([auto_now=False,auto_now_add=False]) 日期類型

auto_now:每次保存對象時,自動設置爲當前時間(最後一次修改)
auto_now_add:每次對象被建立時,被自動設置爲當前時間(第一次建立)
auto_now,anto_now_add,default 不能同時被設置

TimeField 時間類型,參數和DateField相同
DateTimeField 日期-時間類型,參數和DateField相同
FileField 上傳文件的字段
ImageField 繼承了FileField全部屬性和方法,確保是一個有效的image文件

舉個栗子:

from django.db import models

class Students(models.Model):
    # 字段
    id = models.AutoField(primary_key=True)  # 建立一個自增的主鍵字段
    name = models.CharField(null=False,max_length=20)  # 建立一個varchar(20)類型的name且不能爲空
    age = models.IntegerField()
    gender = models.BooleanField()

字段選項:對字段進行的約束

null 設置爲true,存入空值到數據庫,默認爲false,數據庫範疇
blank 設爲true ,該字段容許爲空白,默認爲false,表單驗證範疇
db_column 設置字段的名稱,若字段名未指定,則使用設置的屬性名稱
db_index 設爲true,表會爲此字段建立索引
default 設置爲默認值
primary_key 設置爲true ,則該字段會成爲模型的主鍵
unique 設置爲true ,這個字段在表中必須有惟一值

數據表間的關係

ForeignKey 一對多(經常使用)將字段定義在多的端中
ManyToManyField

多對多,將字段定義在兩端中

OneToOneField 一對一,將字段定義在任意一端中

舉個栗子:

sgrade = models.ForeignKey("Grades")

元選項:在模型類中定義Meta類,用於設置元信息(對數據庫中具體數據的操做(表級操做)例:排序)

例:db_table:定義數據表名,若不定義,則數據表名默認爲:項目名小寫_類名小寫

        ordering:默認排序字段,獲取列表時使用  ordering['id']:升序 ordering['-id']:降序

舉個栗子:

from django.db import models
class Students(models.Model):
    # 字段
    id = models.AutoField(primary_key=True) 
    name = models.CharField(null=False,max_length=20) 
    age = models.IntegerField(null=False)
    gender = models.BooleanField()

    class Meta:
        db_table = "students"    # 修改爲功!
        ordering = ['id']

栗子果:

mysql> use python_mysql
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_python_mysql     |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| students                   |
+----------------------------+

模型成員

模型的類屬性:

    當模型類沒有指定管理器,django則爲模型建立一個名爲objects的管理器,用於和數據庫進行交互(即django模型與數據庫交互的接口)

自定義模型管理器:

  stuObj = models.Manager()  # 自定義的模型管理器(貌似沒什麼luan用)

更深刻的就是自定義模型管理器(Manager()類):

from django.db import models

class studentsManager(models.Manager):
    def get_queryset(self):
        return super(studentsManager, self).get_queryset().filter(gender=False)
        # filter() 過濾函數可屢次疊加

class Students(models.Model):
    stuObj = models.Manager()  # 自定義的模型管理器
    stuObj1 = studentsManager()
    id = models.AutoField(primary_key=True)  
    name = models.CharField(null=False,max_length=20)  
    age = models.IntegerField(null=False)
    gender = models.BooleanField(default=True)

    class Meta:
        db_table = "students"
        ordering = ['id']

可在terminal中驗證:

>>python manage.py shell     # 進入python環境

>>>from my_inn.models import Students;

>>>Students.stuObj1.all();

>>>Students.stuObj.all();        # 可做結果對比

模型的建立對象

         目的:向數據庫中添加數據,當建立對象時,django不會對數據進行讀寫操做,只有調用save()方法後才與數據庫進行交互

兩種方法:

  • 在模型類中增長一個類方法(方法上加上@staticmethod)(即在models 建立表的類下添加方法)
  • 在定義管理器中添加一個方法(即在models 中studentsManager管理器中添加方法)

注:__init__方法在父類models.Model中被使用,因此咱們建立的對象是空對象。

舉個栗子:

from django.db import models

class studentsManager(models.Manager):
    def get_queryset(self):
        return super(studentsManager, self).get_queryset().filter(gender=False)
        # filter() 過濾函數可屢次疊加
    # 管理器中建立對象
    def createStudent1(self, sname, sage, sgender):
        # stu1 = Students()   # 只能建立students類的屬性,如有外鍵就不通用勒
        stu1 = self.model()     #  類型:'my_inn.models.Students'
        stu1.name = sname
        stu1.age = sage
        stu1.gender = sgender
        return stu1

class Students(models.Model):
    stuObj = models.Manager()  # 自定義的模型管理器
    stuObj1 = studentsManager()
    # 字段
    id = models.AutoField(primary_key=True)  
    name = models.CharField(null=False,max_length=20)  
    age = models.IntegerField(null=False)
    gender = models.BooleanField(default=True)

    class Meta:
        db_table = "students"
        ordering = ['id']

    # 定義一個類方法建立對象
    @classmethod
    def createStudent(cls, sname, sage, sgender):
        stu = cls(name=sname, age=sage,gender=sgender)
        return stu
models.py

對應的在views.py中的函數操做:

from django.shortcuts import render,redirect,HttpResponse
from my_inn import models

def addstudent(request):       # 類方法建立對象
    stu = Students.createStudent('nini',22,0)
    stu.save()         # 更新數據庫
    return HttpResponse('...')

def addstudent1(request):     # 管理器建立對象
    stu = Students.stuObj1.createStudent('nili',23,1)
    stu.save()          # 更新數據庫
    return HttpResponse('...')
Views.py
相關文章
相關標籤/搜索