上一部分給大家介紹Django的視圖。
接下來繼續來了解Django框架,來看第三部分,此部分是對數據庫的操作。
目錄:
一、設計系統表 返回目錄
首先打開sign/models.py,通過模型完成標的創建:
from django.db importmodels#Create your models here.
#發布會表
classEvent(models.Model):
name= models.CharField(max_length=100) #發布會標題
limit = models.IntegerField() #參加人數
status = models.BooleanField() #狀態
address = models.CharField(max_length=200) #地址
start_time = models.DateTimeField("event time") #發布會時間
create_time = models.DateTimeField(auto_now=True) #創建時間(自動獲取當前時間)
def __str__(self):returnself.name#嘉賓表
classGuest(models.Model):
event= models.ForeignKey(Event) #關聯發布會id
realname = models.CharField(max_length=64) #姓名
phone = models.CharField(max_length=16) #手機號
email = models.EmailField() #郵箱
sign = models.BooleanField() #簽到狀態
create_time = models.DateTimeField(auto_now=True) #創建時間(自動獲取當前時間)
def __str__(self):
return self.realname
classMeta: unique_together= ("event","phone")
模型創建好后,進行數據遷移:
打開終端執行:
test:guest zhan$python manage.py makemigrations sign
Migrationsfor'sign':
sign/migrations/0001_initial.py:-Create model Event-Create model Guest
test:guest zhan$python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, sign
Running migrations:
Applying sign.0001_initial... OK
sign/migrations/下會生成0001_initial.py文件:
二、admin后臺管理 ?返回目錄
首先,在sign/admin.py文件中寫入:
from django.contrib importadminfrom sign.models importEvent,Guest#Register your models here.
#這些代碼通知Admin管理工具為這些模塊提供界面
admin.site.register(Event)
admin.site.register(Guest)
如下圖:
登錄Admin后臺系統:http://127.0.0.1:8000/admin/
添加發布會:
列表顯示一列發布會名字,是因為自己定義了__str__():里面的name
如果想顯示全部的列表字段,則在?sign/admin.py中繼續添加:
from django.contrib importadminfrom sign.models importEvent,Guest#Register your models here.
# 添加兩個方法,把字段值放在list_display中
classEventAdmin(admin.ModelAdmin):
list_display= ["id","name","limit","status","address","start_time","create_time"]classGuestAdmin(admin.ModelAdmin):
list_display= ["event","realname","phone","email","sign","create_time"]#這些代碼通知Admin管理工具為這些模塊提供界面
admin.site.register(Event,EventAdmin) # 并添加class進來
admin.site.register(Guest,GuestAdmin)
還可以添加【搜索欄、過濾器】,在sign/admin.py中繼續添加:
from django.contrib importadminfrom sign.models importEvent,Guest#Register your models here.
classEventAdmin(admin.ModelAdmin):
list_display= ["id","name","limit","status","address","start_time","create_time"]
search_fields= ["name"] #搜索欄
list_filter = ["status"] #過濾器
classGuestAdmin(admin.ModelAdmin):
list_display= ["event","realname","phone","email","sign","create_time"]
search_fields= ["realname","phone"] #搜索欄
list_filter = ["sign"] #過濾器
#這些代碼通知Admin管理工具為這些模塊提供界面
admin.site.register(Event,EventAdmin)
admin.site.register(Guest,GuestAdmin)
search_fields:用于創建搜索欄,可以設置匹配多個關鍵字。
list_filter:用于創建字段過濾器。
三、基本數據訪問(SQLite數據庫) ?返回目錄
下面我們通過Django自帶的SQLite操作數據庫,如何通過數據庫進行操作呢,需要命令行運行manage.py的shell命令
python manage.py shell
1、插入語句
# 準備條件
>>>from sign.models import Event,Guest>>>from datetime import datetime>>>Event.objects.all()
]>
>>>Guest.objects.all()
]>
①第一種插入語句:創建和保存
insert_e1 = Event(id='2',
name='魅族發布會',
limit='1000',
status=True,
address='天津梅江會展',
start_time=datetime(2018,10,15,12,0,0))
insert_e1.save()
②第二種插入語句:直接創建
Event.objects.create(id='2',
name='魅族發布會',
limit='1000',
status=True,
address='天津梅江會展',
start_time=datetime(2018,10,15,12,0,0))
Guest.objects.create(realname='owen',
phone= '136',
email='136@qq.com',
sign=False,
event_id='2')
但是會提示警告信息:
1430: RuntimeWarning: DateTimeField Event.start_time received a naive datetime (2018-10-15 12:00:00) whiletime zone support is active.
RuntimeWarning)
UTC問題,可以忽略此問題,guest/settings.py中,設置USE_TZ = False。
2、查詢語句
(1)精確查詢
address作為查詢條件,查詢name
>>> e1 = Event.objects.get(address ='天津梅江會展')>>>e1.name
'魅族發布會'# 或者
>>> Event.objects.get(address = '天津梅江會展').name
'魅族發布會'
>>>
相對應的Guest表:
>>> g1 = Guest.objects.get(realname__contains='ow')>>>g1.event
>>>g1.event.name
'魅族發布會'>>>g1.event.address
'天津梅江會展'>>>
(2)模糊查詢
只想查詢關鍵字
filter()方法是從數據庫中取得匹配結果,返回的是列表;name與contains雙下劃線連接,contains類似于LIKE語句。
>>> Event.objects.filter(name__contains='發布會')
, ]>
>>>
(3)刪除數據
注:我寫的是模糊查詢刪除,最好是精確刪除。
>>> g1 = Guest.objects.get(realname__contains='ow')>>>g1.delete()
(1, {'sign.Guest': 1})>>>
#或者
>>> Guest.objects.get(realname__contains='ow').delete()
(1, {'sign.Guest': 1})>>>
(4)更新數據
>>> g1 = Guest.objects.get(realname__contains='ow')>>> g1.realname='owen02'>>>g1.save()>>>
#或者
Guest.objects.select_for_update().filter(realname__contains='ow').update(realname='owen')1
四、Django配置MySQL ?返回目錄
雖然SQLite數據庫可以操作數據,但是不適用于大型項目,下面來介紹MySQL數據庫在Django中的操作。
1、安裝Mysql數據庫
2、MySQL數據庫基本操作
數據庫操作:
#進入mysql
mysql -u root -p
# 查看數據庫
show databases;
# 創建數據庫create database if not existsguest;
# 進入guest數據庫useguest;
# 查看數據庫的表
show tables;
# 創建表create table if not existssign_guest(
idintunsigned auto_increment,
realnamevarchar(100)not null,
phonevarchar(16) not null,
emailVARCHAR(20) UNIQUE, # UNIQUE:不可重復,只有null是可以重復sign varchar(5),
create_time date,primary key(id,phone)
)charset=utf8;
# 查看表屬性descsign_guest;
# 插入數據insert into sign_guest(realname,phone,email,sign,create_time)values('zc','16612345678','123@qq.com','1',now())
3、安裝pymysql
安裝命令:
pip install pymysql
在此忽略......
4、在Django中配置MySQL
修改guest/settings.py下的DATABASES
DATABASES ={'default': {'ENGINE': 'django.db.backends.mysql', #驅動
'HOST': '127.0.0.1', #主機地址
'PORT': '3306', #端口號
'NAME': 'guest', #數據庫
'USER': 'root', #登錄用戶名
'PASSWORD': '1234567', #登錄密碼
'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
在guest項目中輸入命令:
test:guest zhan$ python manage.py migrate
但是報錯:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'
原因為沒有MySQLdb驅動,解決辦法如下:
在.../guest/__init__.py中添加代碼:
importpymysql
pymysql.install_as_MySQLdb()
然后再執行命令:
python manage.py migrate
但是,會提示錯誤,如果沒有問題跳過此段落:
......
Applying auth.0006_require_contenttypes_0002...OK
Applying auth.0007_alter_validators_add_error_messages...OK
Applying auth.0008_alter_user_username_max_length...OK
Applying sessions.0001_initial...OK
Applying sign.0001_initial...Traceback (most recent call last):
...
...
...
pymysql.err.InternalError: (1050, "Table 'sign_guest' already exists")
原因為我在上面寫mysql基本數據庫操作時候,自己創建了sign_guest表,所以最好刪除guest數據庫,重新再執行一遍命令。
終端進入數據庫,具體操作不描述,上面基本操作介紹過。
#刪除數據庫
drop database guest;#創建數據庫
create database guest;
再執行命令:
python manage.py migrate
正確顯示如下:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, sign
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK
Applying sign.0001_initial... OK
因為更換了數據庫,所以里面的Admin超級管理員賬號也需要重新創建。
然后再終端輸入命令:
python manage.py createsuperuser
Username (leave blank to use 'zhan'): admin
Email address: xxx@xxx.com
Password:
Password (again):
Superuser created successfully.
至此,Django的模型創建完畢,下一篇介紹Django模板