Django ORM
# 即對象關系模型
# 類——表
# 對象——記錄
# 對象屬性(值)——記錄某個字段(值)
#在models.py中寫一個類
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=100) #CharField必須指定長度
password = models.CharField(max_length=100, verbose_name = '密碼') #verbose_name即字段名注釋
# 數據庫遷移命令,只要修改了models.py中關于數據庫的代碼就要執行以下兩條遷移數據
python manage.py makemigrations #將操作記錄記錄到migrations文件夾
python manage.py migrate #將操作同步到數據庫中
# 當沒有定義主鍵時,ORM會自動創建一個id字段作為主鍵
字段的增刪改查
# 在原有的類中添加屬性
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=100)
password = models.CharField(max_length=100)
age = models.IntegerField(verbose_name='年齡')
# 在遷移中給出新建字段默認值
info = models.CharField(max_length=100, verbose_name='個人信息', null=True)
hobby = models.CharField(max_length=100, verbose_name='愛好', default='read')
# 修改字段
直接改類代碼,然后執行遷移
# 刪除字段
直接刪除類中設計的字段,然后遷移
數據的增刪改查
# 數據查詢 eg:views.py
username = request.POST.get('username')
password = request.POST.get('password')
res = models.User.objects.filter(username=username)
#返回列表[User對象1,User對象2,User對象3]
data = models.User.objects.filter() #查詢所有
user_queryset = models.User.objects.all() #查詢所有
# 數據增加
def register(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
if models.User.objects.filter(username=username):
return HttpResponse('用戶名已存在,請使用其他用戶名注冊')
res = models.User.objects.create(username=username,password=password)
return HttpResponse(f'用戶{res.username}注冊成功')
return render(request, 'register.html')
# 或
user_obj = models.User(username=username,password=password)
user_obj.save()
# 數據編輯
'''
<tbody>
{% for user_obj in user_queryset %}
<tr>
<td>{{ user_obj.id }}</td>
<td>{{ user_obj.username }}</td>
<td>{{ user_obj.password }}</td>
<td>{{ user_obj.age }}</td>
<td>{{ user_obj.hobby }}</td>
<td>{{ user_obj.info }}</td>
<td> ***通過網頁后綴傳遞user_id信息給編輯路由***
<a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-success btn-xs">編輯</a>
<a href="/del_user/" class="btn btn-danger btn-xs">刪除</a>
</td>
</tr>
{% endfor %}
</tbody>
'''
def edit_user(request):
edit_id = request.GET.get('user_id')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
age = request.POST.get('age')
hobby = request.POST.get('hobby')
info = request.POST.get('info')
# 批量更新
models.User.objects.filter(id=edit_id).update(username=username,\
password=password,age=age,hobby=hobby,info=info)
return redirect('/userlist/')
edit_obj = models.User.objects.filter(id=edit_id).first()
return render(request,'edit_user.html',{'edit_obj':edit_obj})
# 數據刪除
def del_user(request):
del_id = request.GET.get('user_id')
models.User.objects.filter(id=del_id).delete() #批量刪除
return redirect('/userlist/')
# 刪除數據并不是真正的內部刪除,而是修改該記錄的特殊標識字段的值
創建表關系
'''
表關系:一對一、一對多、多對多
判斷方法:換位思考,單向一對多即一對多,雙向一對多即多對多,雙向一對一即一對一
'''
# 圖書表 作者表 出版社表 作者詳情表
# 出版社和圖書是一對多的關系,外鍵建在圖書表
# 作者和圖書是多對多的關系,應該手動創建新表-圖書作者關系表:book2author,id,book_id,author_id
# 作者與作者詳情是一對一的關系
# 創建表關系,先創建基表,再添加外鍵字段,最后一起遷移
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
# 出版社和圖書是一對多的關系,外鍵建在圖書表
publish = models.ForeignKey(to='Publish') #默認與目的表主鍵關聯
# 圖書和作者是多對多的關系,本應新建二者關系表,在django中,外鍵字段建在查詢頻率較高的一方
# ForeignKey對應的字段會在字段名后加'_id'生成最終的字段名
authors = models.ManyToManyField(to='Author') # 虛擬字段,告訴ORM圖書與作者多對多的關系
# ORM會自動創建二者關系新表,創建時使用兩張表的主鍵
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
# 作者與作者詳情是一對一的關系,外鍵應建在查詢頻率較高的表
# OneToOneField對應的字段也會在字段名后加'_id'生成最終的字段名
author_details = models.OneToOneField(to='AuthorDetails')
class AuthorDetails(models.Model):
phone = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
# 在django 1.x版本中,數據庫外鍵都是默認級聯更新、級聯刪除的。