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

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

ebe 強制 () 關系 相互 方法 groups 汽車 decode

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,生成遷移文件
[root@test-01 cmdb-14]# python manage.py makemigrations webanalysis
Migrations for ‘webanalysis‘:
  webanalysis/migrations/0002_idc.py
    - Create model Idc

##展示遷移的sql語句
[root@test-01 cmdb-14]# python manage.py sqlmigrate webanalysis 0002

##數據遷移
[root@test-01 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")
from django.http import QueryDict

<QueryDict: {‘username‘: [‘user3‘], ‘groupname‘: [‘admin‘]}>
class GroupManage(View):
    def get_group(self):
        print(QueryDict(self.request.body))
        try:
            groupobj = Group.objects.get(name=QueryDict(self.request.body).get(‘groupname‘))
        except Group.DoesNotExist:
            raise Http404
        except Group.MultipleObjectsReturned:
            raise Http404
        return groupobj

    def user_group(self):
        try:
            userobj = User.objects.get(username=QueryDict(self.request.body).get(‘username‘))
        except User.DoesNotExist:
            raise Http404
        except User.MultipleObjectsReturned:
            raise Http404
        return userobj

    def delete(self,request,*args,**kwargs):
        ‘‘‘
        將用戶從用戶組裏刪除
        ‘‘‘
        userobj = self.user_group()
        groupobj = self.get_group()
        groupobj.user_set.remove(userobj)
        return HttpResponse(‘用戶已從用戶組裏刪除‘)

    def put(self,request,*args,**kwargs):
        ‘‘‘
        將用戶添加至用戶組裏
        ‘‘‘
        userobj = self.user_group()
        groupobj = self.get_group()
        groupobj.user_set.add(userobj)

        return HttpResponse(‘用戶已添加至用戶組‘)
驗證:
In [46]: import requests
In [42]: data={‘username‘:‘user3‘,"groupname":‘admin‘}                                                                               

In [43]: url="http://192.168.1.16:8000/dashboard/usergroupmanage/"                                                                   

In [44]: r = requests.put(url,data=data)                                                                                                  

In [45]: r.content.decode(‘utf8‘)                                                                                                    
Out[45]: ‘用戶已添加至用戶組‘

In [73]: r = requests.delete(url,data=data)                                                                                          

In [74]: r.content.decode(‘utf8‘)                                                                                                    
Out[74]: ‘用戶已從用戶組裏刪除

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