Django Models一对多操作
生活随笔
收集整理的這篇文章主要介紹了
Django Models一对多操作
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
特別注意:
新版django新建ForeignKey時(shí)需要添加?on_delete=models.CASCADE,即
models.ForeignKey("UserType",on_delete=models.CASCADE)一,新建models文件 class UserInfo(models.Model):
name = models.CharField(max_length=10)
password = models.CharField(max_length=100)
user_type = models.ForeignKey("UserType",on_delete=models.CASCADE)
class UserType(models.Model):
id = models.AutoField(primary_key=True)
caption = models.CharField(max_length=10)
二,在views下添加數(shù)據(jù)
1.使用create添加數(shù)據(jù) models.UserType.objects.create(caption="管理員")
2.使用對(duì)象管理添加數(shù)據(jù)
2.1 obj = models.UserType()
obj.caption = "超級(jí)管理員"
obj.save()
2.2
obj1 = models.UserType(caption="普通用戶")
obj1.save()
3.使用字典方式添加數(shù)據(jù) user_type_dict = {"caption":"打雜的"}
models.UserType.objects.create(**user_type_dict)
user_info_dict1 = {"name":"n1","password":"123","user_type":models.UserType.objects.get(caption="管理員")}
models.UserInfo.objects.create(**user_info_dict1)
user_info_dict2 = {"name": "n2", "password": "123", "user_type": models.UserType.objects.get(caption="超級(jí)管理員")}
models.UserInfo.objects.create(**user_info_dict2)
user_info_dict3 = {"name": "n3", "password": "123", "user_type": models.UserType.objects.get(caption="普通用戶")}
models.UserInfo.objects.create(**user_info_dict3)
三,models正向查找
1.通過(guò)外鍵查找其他表數(shù)據(jù)
obj = models.UserInfo.objects.filter(name="n1").first()
print(obj.user_type.caption)
通過(guò)UserInfo表查找UserType表的caption列的數(shù)據(jù),使用外鍵user_type
2.通過(guò)牛逼的雙下劃線__正向連表操作
obj = models.UserInfo.objects.filter(name="n1",user_type__caption="管理員").values("name","user_type__caption")
print(obj.all().first().get("name"))
通過(guò)filter過(guò)濾條件,通過(guò)外鍵__其他表的屬性來(lái)操作其他表,這與第一種操作方式(三【1】)的區(qū)別是:
這是對(duì) 對(duì)象來(lái)進(jìn)行操作,而之前都是通過(guò)對(duì)某一行具體的數(shù)據(jù)進(jìn)行操作
values方法表示新數(shù)據(jù)有哪些列,values會(huì)生成一個(gè)字典,還有一個(gè)values_list,會(huì)生成一個(gè)元組
四,models反向查找
1.通過(guò)_set反向查找
obj = models.UserType.objects.filter(caption="管理員").first()
print(obj.userinfo_set.all().first().password)
反向查找時(shí)時(shí)通過(guò)其他表的表名加_set進(jìn)行列的選取,而正向查找時(shí)時(shí)通過(guò)外鍵,除此之外,userinfo_set生成的是一個(gè)特殊對(duì)象djangoapp.UserInfo.None,
特別注意:通過(guò)_set進(jìn)行反向查找時(shí),必須要使用表名,而不是類名,即:有大小寫區(qū)分 2.通過(guò)牛逼的雙下劃線__反向連表操作
obj = models.UserType.objects.filter(caption="管理員").values("caption","userinfo__name")
print(obj)
通過(guò)caption進(jìn)行filter,在顯示值的時(shí)候,使用了表名+__列名來(lái)進(jìn)行反向連表操作
總結(jié):在使用連表操作時(shí)(即:要展示多個(gè)表的數(shù)據(jù)時(shí)),都使用__來(lái)進(jìn)行表之間的屬性調(diào)用,正向查找使用外鍵,反向查找使用表名
在表1調(diào)用表2的數(shù)據(jù)時(shí),正向查找使用外鍵.屬性,反向查找使用表名_set
補(bǔ)充:
一對(duì)一連表操作時(shí)一對(duì)多連表操作的衍化
1.使用外鍵一對(duì)一
外鍵與外鍵關(guān)聯(lián)的列使用唯一索引,即:unique=True,這樣兩張表就一對(duì)一了
2.使用models.OneToOneField創(chuàng)建一對(duì)一關(guān)系,原理就是1
轉(zhuǎn)載于:https://www.cnblogs.com/binpeng/p/8947888.html
總結(jié)
以上是生活随笔為你收集整理的Django Models一对多操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu下搭建一个数据化处理的开发环
- 下一篇: 硬分叉升级越来越近,BCH社区都在做什么