四 Django框架,models.py模塊,數據庫操作——創建表、數據類型、索引、admin后台,補充Django目錄說明以及全局配置文件配置


Django框架,models.py模塊,數據庫操作——創建表、數據類型、索引、admin后台,補充Django目錄說明以及全局配置文件配置

 

 

 數據庫配置  

django默認支持sqlite,mysql, oracle,postgresql數據庫。

 

1,django默認使用sqlite的數據庫,默認自帶sqlite的數據庫驅動

 

   引擎名稱:django.db.backends.sqlite3

  在全局配置文件settings.py可以看到確認配置使用sqlite數據庫

復制代碼
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
# 默認配置使用的sqlite數據庫
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',                 #配置數據庫引擎名稱
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),           #生成數據庫到當前的項目文件夾里
    }
}
復制代碼

 

所以我們首次運行程序時會在目錄生成db.sqlite3數據庫

 

 

2,MySQL數據庫【重點】

mysql驅動程序

          MySQLdb(mysql python)

          mysqlclient

          MySQL

          PyMySQL(純python的mysql驅動程序)

在django的項目中會默認使用sqlite數據庫,如果要使用MySQL數據庫需要重新配置MySQL數據庫信息,將sqlite數據庫注釋掉

settings.py配置MySQL數據庫信息

復制代碼
#MySQL數據庫
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',       #配置數據庫引擎名稱
        'NAME': 'jxiou',                            #數據庫名稱
        'USER': 'root',                             #數據庫用戶名
        'PASSWORD': '279819',                       #數據庫密碼
        'HOST': '127.0.0.1',                        #數據庫鏈接地址
        'PORT': '3306',                             #數據庫端口
    }
}
復制代碼

 

注意:NAME即數據庫的名字,在mysql連接前該數據庫必須已經創建,而上面的sqlite數據庫下的db.sqlite3則是項目自動創建

USER和PASSWORD分別是數據庫的用戶名和密碼。

設置完后,再啟動我們的Django項目前,需要激活我們的mysql。

然后,啟動項目,會報錯:no module named MySQLdb

這是因為django默認你導入的驅動是MySQLdb,可是MySQLdb對於py3有很大問題,所以我們需要的驅動是PyMySQL

所以,我們只需要找到項目里的全局配置里的__init__,py配置數據庫驅動

在里面寫入:

import pymysql

pymysql.install_as_MySQLdb()

 

 

此時django框架連接MySQL數據庫配置好了

 

給PyCharm安裝MySQL數據庫管理插件

配置數據庫信息

下載數據庫管理插件

 

 

django創建數據庫表

在操作數據庫表之前,首先檢查一下全局配置文件settings.py里的數據庫表操作配置里是否配置了應用路徑,如果沒有需要加入應用路徑

復制代碼
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
]
復制代碼

 

配置好了我們開始創建表

對數據庫表的操作都是由django下db模塊的models對象來操作的,所以需要導入這個對象

注意:一張表對應一個類

首先要創建一個類來操作一張表,而這個類必須繼承models.Model對象

注意創建表之前,必須要先創建好數據庫

 

復制代碼
from __future__ import unicode_literals

from django.db import models        #導入models對象

class userinfo(models.Model):       #創建類必須繼承models.Model,類名將是在數據庫里的表名稱
    #不設置主鍵id將自動創建
    anem = models.CharField("用戶名",max_length=50)       #設置一個anem名稱的字符串字段,最大長度50位,在django后台顯示名稱為:用戶名
    address = models.CharField("地址", max_length=50)
    city = models.CharField('城市', max_length=60)
    country = models.CharField(max_length=50)

    class Meta:
        verbose_name = '用戶表'                           #設置表名稱在django后台顯示的中文名稱
        verbose_name_plural = verbose_name

    def __str__(self):                                   #設置在django后台顯示字段名稱
        return self.anem
復制代碼

 

設置好操作表的類后,我們需要生成表,生成表需要在PyCharm的終端輸入命令,先輸入 makemigrations  然后在輸入   migrate   來生成表

 

此時表就生成了

 

注意:我們已經生成了需要的表,也包含我們自定義的userinfo表,此時數據庫里的django_migrations表記錄了,我們生成表時的信息,

如果我們將我們的userinfo表,刪除后,在執行命令重建我們的userinfo表,將無法生成,因為django_migrations表記錄了你已經生成了

解決方法:

現將項目里migrations目錄下的緩存刪除

在重新執行命令,makemigrations  然后在輸入   migrate   來生成表,會提示你已經生成了這個表

我們打開django_migrations表里找到,與現在migrations目錄下緩存名稱相同的記錄

我們把django_migrations表里的這條記錄,刪除后,就可以再次生成了

重點:注意只刪除django_migrations表里,與現在migrations目錄下緩存名稱相同的記錄,否則將出問題

 

 

配置django的admin數據庫管理后台

首先配置數據庫后台路由映射

復制代碼
from django.conf.urls import url
from django.contrib import admin
from app1 import views

urlpatterns = [
    url(r'admin/', admin.site.urls),   #路由映射admin數據庫管理
    url(r'articles/', views.special)     #路由映射第三個參數,額外傳參,字典方式,邏輯處理函數以參數方式接收字典鍵
]
復制代碼

然后在PyCharm終端輸入命令 Python manage.py createsuperuser

1、設置用戶名

2、設置郵箱

3、設置密碼,8位以上,不能純數字

4、確認密碼

然后用剛才設置的用戶名和密碼登錄

只能看到剛才創建的用戶登錄數據,數據庫數據需要在項目的admin.py里注冊才能看到

admin.site.register(參數是數據庫操作表的類),注冊數據庫到admin數據庫管理,參數是models.py里操作數據庫表的類

from django.contrib import admin
from app1.models import *

admin.site.register(userinfo) #注冊數據庫到admin數據庫管理,參數是models.py里操作數據庫表的類

 

此時,可以看到admin管理頁面已經出現了我們剛才創建的,用戶表,顯示的是中文,而且字段,也是中文,因為我們在用戶表類里設置了admin顯示中文的名稱

復制代碼
from __future__ import unicode_literals

from django.db import models        #導入models對象

class userinfo(models.Model):       #創建類必須繼承models.Model,類名將是在數據庫里的表名稱
    #不設置主鍵id將自動創建
    anem = models.CharField("用戶名",max_length=50)       #設置一個anem名稱的字符串字段,最大長度50位,在django后台顯示名稱為:用戶名
    address = models.CharField("地址", max_length=50)
    city = models.CharField('城市', max_length=60)
    country = models.CharField(max_length=50)

    class Meta:
        verbose_name = '用戶表'                           #設置表名稱在django后台顯示的中文名稱
        verbose_name_plural = verbose_name

    def __str__(self):                                   #設置在django后台顯示字段名稱
        return self.anem
復制代碼

我們創建一條數據看看

此時我們看到只顯示了一個字段

 

此時,我們需要配置admin顯示所有字段

方法:找到項目應用里的admin.py文件,在注冊表到admin哪里添加一個類,類繼承admin.ModelAdmin類

配置好相應字段后,將類同表一起注冊到admin

復制代碼
from django.contrib import admin
from app1.models import *

#配置userinfo表在admin的顯示信息
class userinfoAdmin(admin.ModelAdmin):
    # 配置顯示字段,
    list_display = ('anem', 'address','city','country')
    # 配置查詢字段
    search_fields = ('anem','city')
    # 配置排序字段
    ordering = ('-id',)
    # 配置右邊是否有過濾條件字段
    list_filter = ('address',)
admin.site.register(userinfo,userinfoAdmin) #注冊數據庫到admin數據庫管理,參數是models.py里操作數據庫表的類
復制代碼

 

下面介紹表的數據類型,以及參數

 

復制代碼
from __future__ import unicode_literals

from django.db import models        #導入models對象

class userinfo(models.Model):       #創建類必須繼承models.Model,類名將是在數據庫里的表名稱
    #不設置主鍵id將自動創建
    anem = models.CharField("用戶名",max_length=50)       #設置一個anem名稱的字符串字段,最大長度50位,在django后台顯示名稱為:用戶名
    address = models.CharField("地址", max_length=50)
    city = models.CharField('城市', max_length=60)
    country = models.CharField('性別',max_length=50)

    class Meta:
        verbose_name = '用戶表'                           #設置表名稱在django后台顯示的中文名稱
        verbose_name_plural = verbose_name

    def __str__(self):                                   #設置在django后台顯示字段名稱
        return self.anem
復制代碼

 

上面我們只用到了CharField(),也就是varchar字符串類型,參數也只用到max_length=50,最大長度50位

 

 

models對象的數據類型

復制代碼
AutoField(Field)
        - int自增列,必須填入參數 primary_key=True

    BigAutoField(AutoField)
        - bigint自增列,必須填入參數 primary_key=True

        注:當model中如果沒有自增列,則自動會創建一個列名為id的列
        from django.db import models

        class UserInfo(models.Model):
            # 自動創建一個列名為id的且為自增的整數列
            username = models.CharField(max_length=32)

        class Group(models.Model):
            # 自定義自增列
            nid = models.AutoField(primary_key=True)
            name = models.CharField(max_length=32)

    SmallIntegerField(IntegerField):
        - 小整數 -32768 ~ 32767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正小整數 0 ~ 32767
    IntegerField(Field)
        - 整數列(有符號的) -2147483648 ~ 2147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正整數 0 ~ 2147483647

    BigIntegerField(IntegerField):
        - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807

    自定義無符號整數字段

        class UnsignedIntegerField(models.IntegerField):
            def db_type(self, connection):
                return 'integer UNSIGNED'

        PS: 返回值為字段在數據庫中的屬性,Django字段默認的值為:
            'AutoField': 'integer AUTO_INCREMENT',
            'BigAutoField': 'bigint AUTO_INCREMENT',
            'BinaryField': 'longblob',
            'BooleanField': 'bool',
            'CharField': 'varchar(%(max_length)s)',
            'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
            'DateField': 'date',
            'DateTimeField': 'datetime',
            'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
            'DurationField': 'bigint',
            'FileField': 'varchar(%(max_length)s)',
            'FilePathField': 'varchar(%(max_length)s)',
            'FloatField': 'double precision',
            'IntegerField': 'integer',
            'BigIntegerField': 'bigint',
            'IPAddressField': 'char(15)',
            'GenericIPAddressField': 'char(39)',
            'NullBooleanField': 'bool',
            'OneToOneField': 'integer',
            'PositiveIntegerField': 'integer UNSIGNED',
            'PositiveSmallIntegerField': 'smallint UNSIGNED',
            'SlugField': 'varchar(%(max_length)s)',
            'SmallIntegerField': 'smallint',
            'TextField': 'longtext',
            'TimeField': 'time',
            'UUIDField': 'char(32)',

    BooleanField(Field)
        - 布爾值類型

    NullBooleanField(Field):
        - 可以為空的布爾值

    CharField(Field)
        - 字符類型
        - 必須提供max_length參數, max_length表示字符長度

    TextField(Field)
        - 文本類型

    EmailField(CharField):
        - 字符串類型,Django Admin以及ModelForm中提供驗證機制

    IPAddressField(Field)
        - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制

    GenericIPAddressField(Field)
        - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
        - 參數:
            protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
            unpack_ipv4, 如果指定為True,則輸入::ffff:192.0.2.1時候,可解析為192.0.2.1,開啟刺功能,需要protocol="both"

    URLField(CharField)
        - 字符串類型,Django Admin以及ModelForm中提供驗證 URL

    SlugField(CharField)
        - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下划線、連接符(減號)

    CommaSeparatedIntegerField(CharField)
        - 字符串類型,格式必須為逗號分割的數字

    UUIDField(Field)
        - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證

    FilePathField(Field)
        - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
        - 參數:
                path,                      文件夾路徑
                match=None,                正則匹配
                recursive=False,           遞歸下面的文件夾
                allow_files=True,          允許文件
                allow_folders=False,       允許文件夾

    FileField(Field)
        - 字符串,路徑保存在數據庫,文件上傳到指定目錄
        - 參數:
            upload_to = ""      上傳文件的保存路徑
            storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage

    ImageField(FileField)
        - 字符串,路徑保存在數據庫,文件上傳到指定目錄
        - 參數:
            upload_to = ""      上傳文件的保存路徑
            storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
            width_field=None,   上傳圖片的高度保存的數據庫字段名(字符串)
            height_field=None   上傳圖片的寬度保存的數據庫字段名(字符串)

    DateTimeField(DateField)
        - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

    DateField(DateTimeCheckMixin, Field)
        - 日期格式      YYYY-MM-DD

    TimeField(DateTimeCheckMixin, Field)
        - 時間格式      HH:MM[:ss[.uuuuuu]]

    DurationField(Field)
        - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值為datetime.timedelta類型

    FloatField(Field)
        - 浮點型

    DecimalField(Field)
        - 10進制小數
        - 參數:
            max_digits,小數總長度
            decimal_places,小數位長度

    BinaryField(Field)
        - 二進制類型
復制代碼

 

數據類型參數

復制代碼
   null                數據庫中字段是否可以為空
    db_column           數據庫中字段的列名
    db_tablespace
    default             數據庫中字段的默認值
    primary_key         數據庫中字段是否為主鍵

   auto_now 和 auto_now_add
    auto_now 會自動創建時間字段,無論添加或者修改,都是系統當前時間
    auto_now_add 會自動創建時間字段,永遠是創建時的時間

    db_index            數據庫中字段是否可以建立索引
    unique              數據庫中字段是否可以建立唯一索引
    unique_for_date     數據庫中字段【日期】部分是否可以建立唯一索引
    unique_for_month    數據庫中字段【月】部分是否可以建立唯一索引
    unique_for_year     數據庫中字段【年】部分是否可以建立唯一索引

    verbose_name        Admin中顯示的字段名稱
    blank               Admin中是否允許用戶輸入為空
    editable            Admin中是否可以編輯
    help_text           Admin中該字段的提示信息
    choices             Admin中顯示選擇框的內容,用不變動的數據放在內存中從而避免跨表操作
                        如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)

    error_messages      自定義錯誤信息(字典類型),從而定制想要顯示的錯誤信息;
                        字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                        如:{'null': "不能為空.", 'invalid': '格式錯誤'}

    validators          自定義錯誤驗證(列表類型),從而定制想要的驗證規則
                        from django.core.validators import RegexValidator
                        from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
                        MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
                        如:
                            test = models.CharField(
                                max_length=32,
                                error_messages={
                                    'c1': '優先錯信息1',
                                    'c2': '優先錯信息2',
                                    'c3': '優先錯信息3',
                                },
                                validators=[
                                    RegexValidator(regex='root_\d+', message='錯誤了', code='c1'),
                                    RegexValidator(regex='root_112233\d+', message='又錯誤了', code='c2'),
                                    EmailValidator(message='又錯誤了', code='c3'), ]
                            )
復制代碼

 

 

創建表索引

普通索引,和聯合普通索引

復制代碼
from __future__ import unicode_literals

from django.db import models        #導入models對象

class yhubiao(models.Model):
    id = models.AutoField('id',primary_key=True)
    anem = models.CharField("用戶名",max_length=50)
    mim = models.CharField("地址", max_length=50)
    country = models.CharField('性別',max_length=50)

    class Meta:
        # 聯合索引
        index_together = [
            ("anem", "mim"),        #一個字段是普通索引,兩個字段是聯合普通索引
        ]

        verbose_name = '用戶表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.anem
復制代碼

 

唯一索引和聯合唯一索引

復制代碼
from __future__ import unicode_literals

from django.db import models        #導入models對象

class yhubiao(models.Model):
    id = models.AutoField('id',primary_key=True)
    anem = models.CharField("用戶名",max_length=50)
    mim = models.CharField("地址", max_length=50)
    country = models.CharField('性別',max_length=50)

    class Meta:
        # 聯合唯一索引
        unique_together = (("mim", "anem"),)        #一個字段是唯一索引,兩個字段是聯合唯一索引

        verbose_name = '用戶表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.anem
復制代碼

觸發驗證

復制代碼
1.觸發Model中的驗證和錯誤提示有兩種方式:
        a. Django Admin中的錯誤信息會優先根據Admiin內部的ModelForm錯誤信息提示,如果都成功,才來檢查Model的字段並顯示指定錯誤信息
        b. 調用Model對象的 clean_fields 方法,如:
            # models.py
            class UserInfo(models.Model):
                nid = models.AutoField(primary_key=True)
                username = models.CharField(max_length=32)

                email = models.EmailField(error_messages={'invalid': '格式錯了.'})

            # views.py
            def index(request):
                obj = models.UserInfo(username='11234', email='uu')
                try:
                    print(obj.clean_fields())
                except Exception as e:
                    print(e)
                return HttpResponse('ok')

           # Model的clean方法是一個鈎子,可用於定制操作,如:上述的異常處理。

    2.Admin中修改錯誤提示
        # admin.py
        from django.contrib import admin
        from model_club import models
        from django import forms


        class UserInfoForm(forms.ModelForm):
            username = forms.CharField(error_messages={'required': '用戶名不能為空.'})
            email = forms.EmailField(error_messages={'invalid': '郵箱格式錯誤.'})
            age = forms.IntegerField(initial=1, error_messages={'required': '請輸入數值.', 'invalid': '年齡必須為數值.'})

            class Meta:
                model = models.UserInfo
                # fields = ('username',)
                fields = "__all__"


        class UserInfoAdmin(admin.ModelAdmin):
            form = UserInfoForm


        admin.site.register(models.UserInfo, UserInfoAdmin)
復制代碼

 

 補充Django目錄說明以及全局配置文件

 Django目錄說明

 

全局配置文件配置

復制代碼
"""
Django settings for Xiangmu project.

Generated by 'django-admin startproject' using Django 1.10.

For more information on this file, see
https://docs.djangoproject.com/en/1.10/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.10/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '!eco91o+^k9q#^j79@oymxltu-%osux)dpet_qv9kp88e)2o*7'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition
# 注冊APP,也就是注冊應用項目,只有注冊了的應用才能操作數據庫
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'Xiangmu.urls'

#配置模板
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]           #配置模板文件路徑,也就是html路徑
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'Xiangmu.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
# 默認配置使用的sqlite數據庫
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',                 #配置數據庫引擎名稱
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),           #生成數據庫到當前的項目文件夾里
#     }
# }

#MySQL數據庫
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',       #配置數據庫引擎名稱
        'NAME': 'jxiou',                            #數據庫名稱
        'USER': 'root',                             #數據庫用戶名
        'PASSWORD': '279819',                       #數據庫密碼
        'HOST': '127.0.0.1',                        #數據庫鏈接地址
        'PORT': '3306',                             #數據庫端口
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/

#配置靜態文件前綴
STATIC_URL = '/static/'
#配置靜態文件目錄
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static')
)
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM