1. 程式人生 > ><三>django模板 模型 模型關係

<三>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模板 模型 模型關係

常用模型欄位型別
<三>django模板 模型 模型關係

注意:預設情況下Django會給每個模型新增下面這個欄位id = models.AutoField(primary_key=True),如果Django看到你顯式地設定了Field.primary_key, 就不會自動新增 id 列,每個模型只有一個欄位指定primary_key=True

<三>django模板 模型 模型關係

<三>django模板 模型 模型關係

資料庫遷移

遷移是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()

新增資料
<三>django模板 模型 模型關係

<三>django模板 模型 模型關係

##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匯入異常

<三>django模板 模型 模型關係

序列化物件
將物件轉換為可讀的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")