程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django 數據模型

編輯:Python

Django模型類似於java語言中的jpa一樣,減少創建數據的數據,簡化在開發中數據庫中的操作。

from django.db import models
from django.urls import reverse
# Create your models here.
class UserBaseInfo(models.Model):
id = models.AutoField(verbose_name='編號', primary_key=True)
username = models.CharField(verbose_name='用戶名稱', max_length=30)
password = models.CharField(verbose_name='密碼', max_length=20)
status = models.CharField(verbose_name='狀態', max_length=1)
createdate = models.DateTimeField(
verbose_name='創建日期', db_column='createDate')
def __str__(self):
return str(self.id)
class Meta:
verbose_name = '人員基本信息'
db_table = 'UserBaseInfo4'

字段類型

字段說明對應mysql字段AutoField自增的主鍵IntBooleanField布爾字段TinyintCharField字符類型varCharDateField日期DateDateTimeField日期時間類型DateTimeIntergetField整數類型IntTexField長文本LongtextTimeField時間TimeFloatField浮點數DoubleFileField字符類型varCharImageField字符類型varCharDecimalField數值類型Decimal

屬性備注:
DecimalField:

  • max_digits:最大位數
  • decimal_places:小數的最大位數
    字段時間類型有auto_now_add和auto_now

字段參數

字段說明verbose_name字段的顯示名稱primary_key設置字段是否為主鍵editable是否可編輯max_length最大長度blank是否可以為空,默認是falsenull是否可以為空,默認是falsedefault默認值choices可選值db_column列名稱db_index是否建立索引unique是否建立唯一性error_messages自定義錯誤信息validators自定義錯誤驗證

Str

設置模型的返回值

Meta類

用於定義Django模型的行為

字段說明abstract是否為抽象類db_table表名managedDjango會管理表的生命周期和遷移等ordering返回數據按照那個字段排序verbose_name模型在後台顯示的名稱index_together聯合索引unique_together聯合約束

表關系

  • 一對一
    OneToOneField

參數:
to 模型名稱
to_field 關聯的字段名稱
on_delete 刪除的配置

字段說明CASCADE級聯刪除PROTECT刪除時出錯SET_NULLnull = True是設置null時置空SET_DEFAULT設置默認值SET設置為指定的值DO_NOTHING不做操作
models.OneToOneField()
  • 一對多
    ForeignKey
  • 多對多
    ManyToManyField

配置mysql

配置數據庫連接工具,默認是用的sqlite3,這裡修改為mysql,並配置了日志。

DATABASES = {

'default': {

# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'POST': '3306',
# 取消外鍵約束
'OPTIONS': {

"init_command": "SET foreign_key_checks = 0;",
},
}
}
LOGGING = {

'version': 1,
'disable_existing_loggers': False,
'handlers': {

'console': {

'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {

'django.db.backends': {

'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
}
},
}

然後生成對應數據表

  1. 生成遷移文件

python manage.py makemigrations

  1. 執行遷移

python manage.py migrate

查詢語句

  1. all()
    查詢所有的語句
In [1]: from app3.models import *
In [2]: users = UserBaseInfos.objects.all()
In [3]: print(users[0].username)
(0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
(0.000) SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; args=None
(0.000) SELECT `UserBaseInfo4`.`id`, `UserBaseInfo4`.`username`, `UserBaseInfo4`.`password`, `UserBaseInfo4`.`status`, `UserBaseInfo4`.`createDate` FROM `UserBaseInfo4` LIMIT 1; args=()
背景牆
  1. filter()
    刪選指定的值,返回一個結果列表
  2. get()
    獲取一個結果集,返回多條數據報錯。
 users = UserBaseInfos.objects.get(id=1)
print(users.username)
  1. exclude()
    排除符合條件的語句,返回結果集
操作符含義例子__gt()大於filter(age__gt=20)__gte()大於或等於filter(age__gte=20)__lt()小於filter(age__lt=20)__lte()小於或等於filter(age__lte=20)__in()在某個列表filter(age__in=[1,0])__contains()模糊匹配filter(age__contains=‘張’)__year()/__month()/__day()日期匹配filter(createdate__year=2011)
  1. values()
    提取對應字段

  2. distinct()

users = UserBaseInfos.objects.distinct().values(‘department’)

新增和更新數據

使用sava()保存更新數據,create()也可新增數據。

users = UserBaseInfos.objects.get(id=1)
users.username = "Django.js"
users.save()

刪除數據

delete()方法刪除數據

F函數和Q函數

F函數可以更新字段,更新之後使用refresh_from_db()

user.salary = F(“salary”) + 1000

Q函數可以支持條件查詢

filter(Q(age__gt=30)&Q(salary__gt=5000))

運行原生的SQL

使用django.db.models.Manager.raw()執行SQL,也可以執行帶參數的SQL語句,使用[]來傳入參數。

users = UserBaseInfos.objects.raw("select * from UserBaseInfo4")
print(users[0].username)

事務

事務的ASID特性:原子性、一致性、隔離性和持久性

Django中事務主要有裝飾器方式和with語句。

@transaction.atomic
def trans(request):
save_id = transaction.savepoint()
try:
---
transaction.savepoint_commit(save_id)
except:
transaction.savepoint_rollback(save_id)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved