<三>django模板 模型 模型關係
django模板
模板查詢順序:
查詢順序
setting.py(INSTALL_APPS)順序查詢(APP)templates目錄下的所有模板名字的字串匹配(先全域性,再區域性),一旦匹配就不會再找
查詢路徑
完整路徑:$APP/templates/user/login.html(從templates路徑下算起)
from django.shortcuts import render from django.views import View from django.views.generic.base import TemplateView class LoginView(View) def get(self, request, *args, **kwargs): retrun render(request, 'test/login.html') class LoginView(TemplateView): template_name = "test/login.html"
django 模型
新建欄位:
常用模型欄位型別
注意:預設情況下Django會給每個模型新增下面這個欄位id = models.AutoField(primary_key=True),如果Django看到你顯式地設定了Field.primary_key, 就不會自動新增 id 列,每個模型只有一個欄位指定primary_key=True
資料庫遷移
遷移是Django同步您對模型所做更改(新增欄位,刪除模型等) 到您的資料庫模式的方式
命令:
pyton manage.py [COMMAND]
migrate,負責應用和取消應用遷移。
makemigrations, 負責基於你的模型修改建立一個新的遷移
sqlmigrate, 展示遷移的sql語句
showmigrations,其中列出了專案的遷移及其狀態。
##遷移指定app,生成遷移檔案
[[email protected] cmdb-14]# python manage.py makemigrations webanalysis
Migrations for 'webanalysis':
webanalysis/migrations/0002_idc.py
- Create model Idc
##展示遷移的sql語句
[ [email protected] cmdb-14]# python manage.py sqlmigrate webanalysis 0002
##資料遷移
[[email protected] cmdb-14]# python manage.py migrate webanalysis
Operations to perform:
Apply all migrations: webanalysis
Running migrations:
Applying webanalysis.0002_idc... OK
注意:建立物件使用save(),或者使用create()方法
模型與資料庫不一致的處理辦法:
誤刪除遷移表,再次進行migration提示該表已存在
##誤操作刪除遷移表
select * from django_migrations;
14 | dashboard | 0001_initial | 2018-10-28 03:42:04
delete from django_migrations where id = 14;
##再次執行遷移
python manage.py migrate dashboard
#報錯:django.db.utils.OperationalError: (1050, "Table 'dashboard_idc' already exists")
##基於版本之間同步 強制執行 不執行資料庫操作
python manage.py migrate dashboard --fake
模型裡面有,資料庫不一致
##先保證model.py與資料庫一致
##刪除遷移檔案app/migrations/0001xxx
##刪除資料庫django_migrations下的遷移記錄
##重新同步makemigrations migrate
delete from django_migrations where id >= 15;
python manage.py makemigrations dashboard
python manage.py migrate dashboard
執行查詢
##匯入模型
python manage.py shell
from [APP].models import [MODEL]
from django.contrib.auth.models import User,Group
>>> User.objects.all()
>>> User.objects.filter(name='xiaopf1').delete()
>>> User.objects.exclude(name='xiaopf1').update(name='xiaopf2')
>>> User.objects.filter(age__gt=10) #age>10 雙下劃線必須得加上
>>> User.objects.filter(age__gte=10) #age>=10
>>> User.objects.filter(age__lte=10)
>>> User.objects.filter(age__lt=10)
>>> User.objects.filter(name__contains='xiaopf')
>>> User.objects.filter(name__endswith='1')
>>> User.objects.filter(age__in=[10,11,12]).count()
>>> User.objects.filter(age__in=[10,11,12]).values('name','id')
>>> User.objects.order_by('age')
>>> User.objects.order_by('-age') #降序
>>> User.objects.order_by('age')[0]
>>> User.objects.order_by('age')[:3]
>>> User.objects.filter(name='xiaopf').update(addr='jieshou')
>>> User.objects.filter(name='xiaopf9').delete()
新增資料
##filter其他查詢方法
###q.exclude/filter(body_text__icontains="food")
exact “精確”匹配
iexact 大小寫不敏感的匹配
contains 大小寫敏感的包含指定字串
icontains 大小寫不敏感的包含指定字串
startswith, endswith 以指字字串開頭或結尾
istartswith, iendswith
in 在給定的列表內
##關係聯絡符
gt 大於
gte 大於或等於
lt 小於
lte 小於或等於
range 在指定範圍內
filter()和get()區別
filter() 始終返回一個查詢集,除非只有一個
只有一個物件滿足你的查詢,使用one_entry = Entry.objects.get(pk=1)
可以對get()使用任何查詢表示式,和filter()一樣
如果沒有結果滿足查詢(單條),get()將引發一個Objects.DoesNotExist異常
如果多條滿足get()查詢條件,引發MultipleObjectsReturned異常
注意:使用from django.core.exceptions import ObjectDoesNotExist,MultipleObjectsReturned匯入異常
序列化物件
將物件轉換為可讀的json格式serializers
from django.contrib.auth.models import User,Group
from django.core import serializers
class GroupListView(View):
'''
獲取用組列表
'''
def get(self, request, *args, **kwargs):
queryset = Group.objects.all()
return HttpResponse(serializers.serialize("json", queryset), content_type="application/json")
django 模型關係
關係資料庫的威力體現在表之間的相互關聯。 Django 提供了三種最常見的資料庫關係:多對一(many-to-one),多對多(many-to-many),一對一(one-to-one)
多對一Django 使用 django.db.models.ForeignKey 定義多對一關係,ForeignKey關聯的模型是一,Foreignkey所在的模型是多
簡單的例子: 比如,一輛Car有一個Manufacturer ,但是一個Manufacturer 生產很多汽車(Car),每一輛Car 只能有一個Manufacturer
class Car(models.Model):
name = models.CharField('名字',max_length=50,null=False,default='')
manufacturer=models.ForeignKey(Manufacturer)
class Manufacturer(models.Model):
name = models.CharField('名字',max_length=50,null=False,default='')
遷移,生產資料庫
驗證:
先有製造商,再有車吧,所以先新建制造商的物件
In [1]: from dashboard.models import Car,Manufacturer
In [2]: m1 = Manufacturer.objects.create(name='寶馬')
In [3]: x1 = Car()
In [4]: x1.manufacturer = m1
In [5]: x1.name = 'x1'
In [6]: x1.save()
##正向查詢,通過小汽車查詢供應商(多對一)
In [8]: x1 = Car.objects.get(name='x1')
In [9]: x1.manufacturer.name
Out[9]: '寶馬'
##反向查詢,通過供應商查詢小汽車(一對多)
In [10]: m = Manufacturer.objects.get(name='寶馬')
In [11]: m.car_set.all()
Out[11]: <QuerySet [<Car: Car object>]>
##修改小汽車關聯供應商物件
In [50]: m1.name
Out[50]: '寶馬'
In [51]: m1.car_set.add(x1)
In [52]: x1.manufacturer.name
Out[52]: '寶馬'
In [53]: x1.name
Out[53]: 'x1'
刪除:
In [54]: x1.delete()
Out[54]: (1, {'dashboard.Car': 1})
注意:刪除物件的時候先檢視是否有關聯,再刪除資料,因為如果刪除供應商,與之關聯的小汽車也將被刪除。
修改:
In [52]: x1.manufacturer.name
Out[52]: '寶馬'
In [53]: x1.name
Out[53]: 'x1'
In [54]: x1.delete()
Out[54]: (1, {'dashboard.Car': 1})
In [55]: m2 = Manufacturer.objects.get(name='奧迪')
In [56]: x1.manufacturer = m2
In [57]: x1.name
Out[57]: 'x1'
In [58]: x1.manufacturer.name
Out[58]: '奧迪'
多對多
ManyToManyField,其中一個models定義就行了,在哪個模型中定義並不重要
例項: 一個組對應多個人,一個人對應多個組
新增:
In [61]: from django.contrib.auth.models import Group,User
In [4]: Group.objects.create(name='admin')
In [4]: u = User.objects.get(username='user1')
In [5]: g1 = Group.objects.get(name='admin')
個人新增到組
In [6]: u.groups.add(g1)
In [7]: u.groups.all()
Out[7]: <QuerySet [<Group: admin>]>
組新增人:
In [11]: u2 = User.objects.get(username='user2')
In [12]: g1.user_set.add(u2)
In [13]: g1.user_set.all()
Out[13]: <QuerySet [<User: user1>, <User: user2>]>
個人刪除組:
In [19]: u2.groups.all()
Out[19]: <QuerySet [<Group: admin>]>
In [20]: u2.groups.remove(g1)
In [21]: u2.groups.all()
Out[21]: <QuerySet []>
組刪除個人:
In [26]: g1.user_set.all()
Out[26]: <QuerySet [<User: user2>]>
In [27]: g1.user_set.remove(u2)
In [28]: g1.user_set.all()
Out[28]: <QuerySet []>
徹底清空:
組:
In [48]: g2.user_set.all()
Out[48]: <QuerySet [<User: user1>, <User: user2>]>
In [49]:
In [49]: g2.user_set.clear()
In [50]: g2.user_set.all()
Out[50]: <QuerySet []>
個人:
In [57]: u.groups.all()
Out[57]: <QuerySet [<Group: wo>, <Group: admin>]>
In [58]: u.groups.clear()
In [59]: u.groups.all()
Out[59]: <QuerySet []>
重點:
使用serializers序列化物件為Json格式
from django.core import serializers
class GroupListView(View):
def get(self, request, *args, **kwargs):
queryset = Group.objects.all()
return HttpResponse(serializers.serialize("json", queryset), content_type="application/json")
Queryset物件或物件集不存在捕捉錯誤
from django.http import HttpResponse,Http404
from django.core.exceptions import ObjectDoesNotExist,MultipleObjectsReturned
class GroupUserView(View):
def get_group_obj(self):
try:
groupobj = Group.objects.get(name=self.request.GET.get('name'))
except Group.DoesNotExist:
raise Http404
except Group.MultipleObjectsReturned:
raise Http404
return groupobj
class GroupMembers(View):
'''
獲取使用者組下的成員列表,引數為組名
'''
def get_group_members(self):
group_name = self.request.GET.get('name')
try:
groupobj = Group.objects.get(name=group_name)
except Group.DoesNotExist:
raise Http404
except Group.MultipleObjectsReturned:
raise Http404
get_group_members = groupobj.user_set.all()
return get_group_members
def get(self,request,*args,**kwargs):
queryset = self.get_group_members()
return HttpResponse(serializers.serialize('json', queryset), content_type="application/json")
class UserGroupList(View):
'''
獲取使用者組列表,引數為使用者名稱
'''
def get_user_obj(self):
userobj = self.get_user()
return userobj.groups.all()
def get_user(self):
try:
userobj = User.objects.get(username=self.request.GET.get('username'))
except User.DoesNotExist:
raise Http404
except User.MultipleObjectsReturned:
raise Http404
return userobj
def get(self,request,*args,**kwargs):
queryset = self.get_user_obj()
return HttpResponse(serializers.serialize('json', queryset), content_type="application/json")