Django ContentType組件詳解
問題
如何在一張表上對(duì)多個(gè)表進(jìn)行外鍵關(guān)聯(lián)
from django.db import models
class Appliance(models.Model):
"""
家用電器表
id name
1 冰箱
2 電視
3 洗衣機(jī)
"""
name = models.CharField(max_length=64)
class Food(models.Model):
"""
食物表
id name
1 面包
2 牛奶
"""
name = models.CharField(max_length=32)
class Fruit(models.Model):
"""
水果表
id name
1 蘋果
2 香蕉
"""
name = models.CharField(max_length=32)
class Coupon(models.Model):
"""
優(yōu)惠券表
id name appliance_id food_id fruit_id
1 通用優(yōu)惠券 null null null
2 冰箱折扣券 1 null null
3 電視折扣券 2 null null
4 蘋果滿減卷 null null 1
"""
name = models.CharField(max_length=32)
appliance = models.ForeignKey(to="Appliance", null=True, blank=True)
food = models.ForeignKey(to="Food", null=True, blank=True)
fruit = models.ForeignKey(to="Fruit", null=True, blank=True)
注意
1.每增加一張表就需要多增加一個(gè)字段,
定義
當(dāng)一張表要跟多張表進(jìn)行外鍵關(guān)聯(lián)的時(shí)候,我們可以使用Django提供的ContentType 組件
ContentTypes是Django內(nèi)置的一個(gè)組件,可以追蹤項(xiàng)目中所有app和model的對(duì)應(yīng)關(guān)系,并記錄在ContentType表中
app1/models.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
class Food(models.Model):
"""
id title
1 面包
2 牛奶
"""
title = models.CharField(max_length=32)
# 不會(huì)生成coupons字段,只用于反向查詢
coupons = GenericRelation(to="Coupon")
class Fruit(models.Model):
"""
id title
1 蘋果
2 香蕉
"""
title = models.CharField(max_length=32)
class Coupon(models.Model):
title = models.CharField(max_length=32)
# 第一步:在 model中定義ForeignKey字段,并關(guān)聯(lián)到ContentType表
content_type = models.ForeignKey(to=ContentType, on_delete=None)
# 第二步:定義IntegerField字段,用來(lái)存儲(chǔ)關(guān)聯(lián)表中的主鍵
object_id = models.IntegerField()
# 第三步 不會(huì)生成字段傳入上面兩個(gè)字段的名字
content_object = GenericForeignKey("content_type", "object_id")
app1\view.py
class DemoView(APIView):
def get(self, request):
# 1.通過(guò)ContentType表找表模型
content = ContentType.objects.filter(app_label="app1", model="food").first()
# 獲得表model對(duì)象 相當(dāng)于models.app1
model_class = content.model_class()
ret = model_class.objects.all()
print(ret)
# 給面包創(chuàng)建一個(gè)優(yōu)惠券
food_obj = Food.objects.filter(id=1).first()
Coupon.objects.create(title="面包九五折", content_type_id=8, object_id=1)
Coupon.objects.create(title="雙十一面包九折促銷", content_object=food_obj)
# 正向查詢:根據(jù)優(yōu)惠信息查詢優(yōu)惠對(duì)象
coupon_obj = Coupon.objects.filter(id=1).first()
content_obj = coupon_obj.content_object
print(content_obj.title)
# 反向查詢:查詢面包都有哪些優(yōu)惠券
coupons = food_obj.coupons.all()
print(coupons[0].title)
# 如果沒定義反向查詢
content = ContentType.objects.filter(app_label="app1", model="food").first()
result = Coupon.objects.filter(content_type=content, object_id=1).all()
print(result[0].name)
return Response("ContentType測(cè)試")
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
詳解Python中類方法@classmethod的應(yīng)用技巧
在Python中,類方法(class method)是一種特殊的方法,可以在不創(chuàng)建類的實(shí)例的情況下調(diào)用,本文將詳細(xì)介紹類方法的概念、用法以及在實(shí)際開發(fā)中的應(yīng)用場(chǎng)景,希望對(duì)大家有所幫助2024-03-03
解決django xadmin主題不顯示和只顯示bootstrap2的問題
這篇文章主要介紹了解決django xadmin主題不顯示和只顯示bootstrap2的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
解決python中無(wú)法自動(dòng)補(bǔ)全代碼的問題
今天小編就為大家分享一篇解決python中無(wú)法自動(dòng)補(bǔ)全代碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
python 實(shí)現(xiàn)docx與doc文件的互相轉(zhuǎn)換
這篇文章主要介紹了python 實(shí)現(xiàn)docx與doc文件的互相轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
python3+PyQt5實(shí)現(xiàn)自定義流體混合窗口部件
這篇文章主要為大家詳細(xì)介紹了python3+PyQt5實(shí)現(xiàn)自定義流體混合窗口部件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
python中for循環(huán)輸出列表索引與對(duì)應(yīng)的值方法
今天小編就為大家分享一篇python中for循環(huán)輸出列表索引與對(duì)應(yīng)的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python中的fileinput模塊的簡(jiǎn)單實(shí)用示例
這篇文章主要介紹了Python中的fileinput模塊實(shí)用示例,文中的示例是使用其來(lái)便利硬盤分區(qū)下的文本文件并打印其中行的長(zhǎng)度,需要的朋友可以參考下2015-07-07

