国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Django基礎(chǔ)之八(模型關(guān)系)

lewif / 2442人閱讀

摘要:默認(rèn)情況下,這個管理器的名字為,其中是源模型的小寫名稱。創(chuàng)建一個新的對象,將它保存并放在關(guān)聯(lián)的對象集中。從關(guān)聯(lián)的對象集中刪除指定的模型對象。

模型關(guān)系 簡介

關(guān)系數(shù)據(jù)庫的威力體現(xiàn)在表之間的相互關(guān)聯(lián),Django提供了三種最常見的數(shù)據(jù)庫關(guān)系:多對一(many-to-one),多對多(many-to-many),一對一(one-to-one)

多對一關(guān)系

多對多關(guān)系

一對一關(guān)系

多對一

django是使用django.db.models.ForeignKey 定義多對一關(guān)系

ForeignKey需要一個位置參數(shù)來指定本Model關(guān)聯(lián)的Model,F(xiàn)oreignKey關(guān)聯(lián)的Model是"一", ForeignKey所在的Model是"多"

比如汽車和制造商的例子,一輛汽車只能屬于一個制造商,但是一個制造商有多輛汽車,這個關(guān)系,用Django的Model來表示,就是

  class Manufacturer(models.Model):
      name = models.CharField(max_length=30)

  class Car(models.Model):
      manufacturer = models.ForeignKey(Manufacturer)
      name = models.CharField(max_length=30)

數(shù)據(jù)創(chuàng)建

In [1]: from dashboard.models import Manufacturer,Car                                   
In [2]: m1 = Manufacturer()                                                             
In [3]: m1.name = "豐田"                                                                
In [4]: m1.save()                                                                       
In [5]: m2 = Manufacturer()                                                             
In [6]: m2.name = "大眾"                                                                
In [7]: m2.save()                                                                       
In [8]: m1                                                                              
Out[8]: 
In [9]: m2                                                                              
Out[9]: 
In [10]: c1 = Car()                                                                     
In [11]: c1.name = "xxx1"                                                               
In [12]: m = Manufacturer.objects.get(pk=1)                                             
In [13]: c1.manufacturer = m                                                            
In [14]: c1.save()                                                                      
In [15]: c2 = Car()                                                                     
In [16]: c2.name = "寶來"                                                               
In [17]: m3 = Manufacturer.objects.get(pk=2)                                            
In [18]: c2.manufacturer = m3                                                           
In [19]: c2.save()   
多對一查詢

正向查詢( ForeignKey 所在的模型查詢關(guān)聯(lián)的模型)

 In [22]: xxx1 = Car.objects.get(name="xxx1")    
In [23]: xxx1                                               
Out[23]: 
In [24]: xxx1.manufacturer                                                                                                                                                       Out[24]: 
In [25]: xxx1.manufacturer.name                                                                                                                                             Out[25]: "寶馬"

反向查詢( ForeignKey 指向的模型查詢ForeignKey 所在的模型)

如果模型有一個ForeignKey,那么該ForeignKey 所指的模型實(shí)例可以通過一個管理器返回前一個有ForeignKey的模型的所有實(shí)例。默認(rèn)情況下,這個管理器的名字為foo_set,其中foo 是源模型的小寫名稱。該管理器返回的查詢集可以用上一節(jié)提到的方式進(jìn)行過濾和操作。

In [27]: m1 = Manufacturer.objects.get(pk=1)                                                                                                                         
In [28]: m1.car_set.all()                                                                                                    
Out[28]: , ]>
In [29]: c2 = Car.objects.get(pk=2)                                       
In [30]: c2                                 
Out[30]: 
In [31]: m1.car_set.add(c2)                       
In [32]: m1.save()   返回多個car對象
多對多

要實(shí)現(xiàn)多對多,就要使用django.db.models.ManyToManyField類,和ForeignKey一樣,它也有一個位置參數(shù),用來指定和它關(guān)聯(lián)的Model
如果不僅僅需要知道兩個Model之間是多對多的關(guān)系,還需要知道這個關(guān)系的更多信息,比如Person和Group是多對多的關(guān)系,每個person可以在多個group里,那么group里可以有多個person

多對多示例
 class Group(models.Model):
     #...

  class Person(models.Model):
      groups = models.ManyToManyField(Group)

建議以被關(guān)聯(lián)模型名稱的復(fù)數(shù)形式做為 ManyToManyField 的名字
在哪個模型中設(shè)置 ManyToManyField 并不重要,在兩個模型中任選一個即可——不要在兩個模型中都設(shè)置

用戶和組操作實(shí)例

In [1]: from django.contrib.auth.models import User,Group                               
In [2]: g = Group.objects.create(name="test")                                           
In [3]: User.objects.all()                                                              
Out[3]: 
In [4]: u = User()                                                                      
In [5]: u.username = "wanghui"                                                          
In [6]: u.email = "122@qq.com"                                                          
In [7]: u.password = "123456"                                                           
In [8]: u.save()                                                                        
In [9]: u1 = User.objects.get(pk=1)                                                     
In [10]: g1 = Group.objects.get(pk=1)                                                   
In [11]: u1.groups                    #證明manytomany在User表                                                    
Out[11]: .ManyRelatedManager at 0x7f3dce15ea58>
In [12]: g1.user_set                                                                    
Out[12]: .ManyRelatedManager at 0x7f3dce0ec748>
In [13]: g1.user_set.add(u1)                                                            
In [14]: g1.save()                                                                      
In [15]: u1 = User.objects.get(pk=1)                                                    
In [16]: u1.groups.all()                                                                
Out[16]: ]>
In [17]: g1 = Group.objects.get(pk=1)                                                   
In [18]: g1.user_set.all()                                                              
Out[18]: ]>
處理關(guān)聯(lián)對象的其它方法
add(obj1, obj2, ...) #添加一指定的模型對象到關(guān)聯(lián)的對象集中。
create(**kwargs) #創(chuàng)建一個新的對象,將它保存并放在關(guān)聯(lián)的對象集中。返回新創(chuàng)建的對象。
remove(obj1, obj2, ...) #從關(guān)聯(lián)的對象集中刪除指定的模型對象。
clear() #從關(guān)聯(lián)的對象集中刪除所有的對象。
一對一
一對一是通過django.db.models.OneToOneField來實(shí)現(xiàn)的,被關(guān)聯(lián)的Model會被加上Unique的限制, OneToOneField要一個位置參數(shù),與模型關(guān)聯(lián)的類
當(dāng)某個對象想擴(kuò)展自另一個對象時,最常用的方式就是在這個對象的主鍵上添加一對一關(guān)系
接口小練習(xí)

需求:

GET:獲取所有用戶組列表
GET:獲取組下的成員列表
GET:獲取用戶的組列表
POST:將用戶添加至指定組
POST:將用戶從指定組中踢出

類視圖如下:

from django.contrib.auth.models import User,Group
from django.core import serializers
from django.http import Http404,QueryDict

class GroupListView(View):
    def get(self,request,*args,**kwargs):
        queryset = Group.objects.all()
        return HttpResponse(serializers.serialize("json",queryset),content_type="application/json")

class GroupMembersView(View):
    def get_queryset(self):
        groupObj = self.get_group_obj()
        return groupObj.user_set.all()

    def get_group_obj(self):
        try:
            groupObj = Group.objects.get(name=self.request.GET.get("name"))
        except Group.DoesNotExist:
            return Http404
        except Group.MultipleObjectsReturned:
            return Http404
        return groupObj

    def get(self,request,*args,**kwargs):
        user_queryset = self.get_queryset()
        return HttpResponse(serializers.serialize("json",user_queryset),content_type="application/json")

class UserGroupsView(View):
    def get_queryset(self):
        userObj = self.get_user_obj()
        return userObj.groups.all()

    def get_user_obj(self):
        try:
            userObj = User.objects.get(username=self.request.GET.get("name"))
        except User.DoesNotExist:
            return Http404
        except User.MultipleObjectsReturned:
            return Http404
        return userObj

    def get(self,request,*args,**kwargs):
        group_queryset = self.get_queryset()
        return HttpResponse(serializers.serialize("json",group_queryset),content_type="application/json")

class UserGroupManageView(View):
    def get_query(self):
        groupObj = self.get_group_obj()
        userObj = self.get_user_obj()

    def get_group_obj(self):
        try:
            groupObj = Group.objects.get(name=QueryDict(self.request.body).get("name"))
        except Group.DoesNotExist:
            return Http404
        except Group.MultipleObjectsReturned:
            return Http404
        return groupObj
        return groupObj

    def get_user_obj(self):
        try:
            userObj = User.objects.get(username=QueryDict(self.request.body).get("name"))
        except User.DoesNotExist:
            return Http404
        except User.MultipleObjectsReturned:
            return Http404
        return userObj

    def delete(self,request,*args,**kwargs):
        groupObj = self.get_group_obj()
        userObj = self.get_user_obj()
        groupObj.user_set.remove(userObj)
        return HttpResponse()

    def put(self,request,*args,**kwargs):
        groupObj = self.get_group_obj()
        userObj = self.get_user_obj()
        groupObj.user_set.add(userObj)
        return HttpResponse()

路由:

urlpatterns = [
    url(r"^grouplist/$",views.GroupListView.as_view()),
    url(r"^groupmembers/$",views.GroupMembersView.as_view()),
    url(r"^usergroups/$",views.UserGroupsView.as_view()),
    url(r"^usergroupmanage/$",views.UserGroupManageView.as_view()),
]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/45014.html

相關(guān)文章

  • Django Model View Template 之間的簡單交互 (二)

    摘要:當(dāng)然還有其他高級的使用,日后再說完整的用戶名郵箱聯(lián)系地址留言信息用戶留言信息使用之前已經(jīng)定義好了數(shù)據(jù)模型的字段元數(shù)據(jù)方法等。 前言 接續(xù)前文,上一篇文章主要涉及了 Django 項(xiàng)目的基礎(chǔ)配置等,這篇主要涉及數(shù)據(jù)庫相關(guān)的 ORM ,也就是 Django 中的 Model 的使用,MVT 三層之間的交互 教程基本都是東拼西湊的,防止有些東西表述不準(zhǔn)確,因?yàn)槲抑皩?JavaScript ...

    Coding01 評論0 收藏0
  • django官方文檔1.11編翻:首頁

    摘要:源網(wǎng)頁說明文檔所有關(guān)于你應(yīng)該且必須知道的。性能和優(yōu)化概述的兼容性旨在兼容多種不同版本的支持的兼容性地理框架打算成為世界級的地理框架。其目標(biāo)是盡可能簡單地構(gòu)建應(yīng)用程序并利用空間使能數(shù)據(jù)的功能。 源網(wǎng)頁:https://docs.djangoproject.co... django說明文檔 所有關(guān)于django你應(yīng)該且必須知道的。 第一步 你是否django編程新手,那就從此開始!從零開始...

    Michael_Lin 評論0 收藏0

發(fā)表評論

0條評論

lewif

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<