您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Django中ContentType組件怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
如何在一張表上對多個表進行外鍵關聯
from django.db import models class Appliance(models.Model): """ 家用電器表 id name 1 冰箱 2 電視 3 洗衣機 """ 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): """ 優惠券表 id name appliance_id food_id fruit_id 1 通用優惠券 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.每增加一張表就需要多增加一個字段,
定義
當一張表要跟多張表進行外鍵關聯的時候,我們可以使用Django提供的ContentType 組件
ContentTypes是Django內置的一個組件,可以追蹤項目中所有app和model的對應關系,并記錄在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) # 不會生成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字段,并關聯到ContentType表 content_type = models.ForeignKey(to=ContentType, on_delete=None) # 第二步:定義IntegerField字段,用來存儲關聯表中的主鍵 object_id = models.IntegerField() # 第三步 不會生成字段傳入上面兩個字段的名字 content_object = GenericForeignKey("content_type", "object_id")
app1\view.py
class DemoView(APIView): def get(self, request): # 1.通過ContentType表找表模型 content = ContentType.objects.filter(app_label="app1", model="food").first() # 獲得表model對象 相當于models.app1 model_class = content.model_class() ret = model_class.objects.all() print(ret) # 給面包創建一個優惠券 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) # 正向查詢:根據優惠信息查詢優惠對象 coupon_obj = Coupon.objects.filter(id=1).first() content_obj = coupon_obj.content_object print(content_obj.title) # 反向查詢:查詢面包都有哪些優惠券 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測試")
關于“Django中ContentType組件怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。