qhfl-2 ContentType组件
生活随笔
收集整理的這篇文章主要介紹了
qhfl-2 ContentType组件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一般商城里有很多的商品,計優惠券對應著活動類型商品,家電是一類商品,食物是一類商品,優惠券對應著不同的商品類別。from django.db import modelsclass Appliance(models.Model):"""家用電器表id name冰箱電視洗衣機"""name = models.CharField(max_length=64)class Food(models.Model):"""食物表id name面包牛奶"""name = models.CharField(max_length=32)class Fruit(models.Model):"""水果表id name蘋果香蕉"""name = models.CharField(max_length=32)class Coupon(models.Model):"""優惠券表id name appliance_id food_id fruit_id通用優惠券 null null null冰箱折扣券 1 null null電視折扣券 2 null null蘋果滿減卷 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)<br># 實際上我們商品的種類會特別的多,導致我們這張表外鍵越來越多
遇到這種一張表要跟多張表進行外鍵關聯的時候~我們Django提供了ContentType組件~需求
需求
ContentType組件
ContentType是Django的內置的一個應用,可以追蹤項目中所有的APP和model的對應關系,并記錄在ContentType表中。
當我們的項目做數據遷移后,會有很多django自帶的表,其中就有django_content_type表
ContentType組件應用:
-- 在model中定義ForeignKey字段,并關聯到ContentType表,通常這個字段命名為content-type
-- 在model中定義PositiveIntergerField字段, 用來存儲關聯表中的主鍵,通常我們用object_id
-- 在model中定義GenericForeignKey字段,傳入上面兩個字段的名字
--? 方便反向查詢可以定義GenericRelation字段
基于ContentType創建表結構
from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation# Create your models here.class Food(models.Model):"""id title1 面包2 牛奶"""title = models.CharField(max_length=32)# 不會生成字段 只用于反向查詢coupons = GenericRelation(to="Coupon")class Fruit(models.Model):"""id title1 蘋果2 香蕉"""title = models.CharField(max_length=32)# 如果有40張表 # class Coupon(models.Model): # """ # id title food_id fruit_id # 1 面包九五折 1 null # 2 香蕉滿10元減5元 null 2 # """ # title = models.CharField(max_length=32) # food = models.ForeignKey(to="Food") # fruit = models.ForeignKey(to="Fruit")# class Coupon(models.Model): # """ # id title table_id object_id # 1 面包九五折 1 1 # 2 香蕉滿10元減5元 2 2 # """ # title = models.CharField(max_length=32) # table = models.ForeignKey(to="Table") # object_id = models.IntegerField() # # # class Table(models.Model): # """ # id app_name table_name # 1 demo food # 2 demo fruit # """ # app_name = models.CharField(max_length=32) # table_name = models.CharField(max_length=32) view class Coupon(models.Model): title = models.CharField(max_length=32) # 優惠券的名稱# 第一步content_type = models.ForeignKey(to=ContentType, on_delete=None) # 商品表# 第二步object_id = models.IntegerField() # 商品對象的id# 第三步 不會生成字段content_object = GenericForeignKey("content_type", "object_id")# # 綁定外鍵關系,防止商品id不在商品表里面這樣無論有多少張優惠券,都只需要外鍵關聯Content_type一張表(里面存著所有表的關系),然后指明對象的id,就能找到優惠券對應的商品
當一張表跟多張表有外鍵關系時,都可以通過 ContentType 組件來建立
ContentType 查詢
demo/views.py
from rest_framework.views import APIView from rest_framework.response import Response from .models import Food, Coupon from django.contrib.contenttypes.models import ContentTypeclass DemoView(APIView):def get(self, request):# 給面包創建一個優惠券food_obj = Food.objects.filter(id=1).first()# Coupon.objects.create(title="面包九五折", content_type_id=8, object_id=1) # 比較麻煩,需要找表id# Coupon.objects.create(title="雙十一面包九折促銷", content_object=food_obj)# 查詢面包都有哪些優惠券coupons = food_obj.coupons.all()print(coupons)# 優惠券查對象coupon_obj = Coupon.objects.filter(id=1).first()content_obj = coupon_obj.content_objectprint(coupon_obj.title)""" <QuerySet [<Coupon: Coupon object (1)>, <Coupon: Coupon object (2)>, <Coupon: Coupon object (3)>, <Coupon: Coupon object (4)>]> 面包九五折 """# 通過ContentType表找表模型content = ContentType.objects.filter(app_label="demo", model="food").first()print(content)model_class = content.model_class()ret = model_class.objects.all()print(ret) """food <QuerySet [<Food: Food object (1)>, <Food: Food object (2)>]>return Response("ContentType測試") """總結
以上是生活随笔為你收集整理的qhfl-2 ContentType组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qhfl-1 跨域
- 下一篇: qhfl-3 Course模块