Django :Content-Type组件
Content_Type 组件
用法:
model.py:
from django.db import models
# Create your models here.
class Food(models.Model):
title = models.CharField(max_length=32)
class Foute(models.Model):
title = models.CharField(max_length=32)
现在有食物和水果两张表,要为其创建一个优惠卷,应该怎么创建呢?
按照之前的创建表关系,首先创建一个优惠卷表,然后在创建一个关联表:
class Coupon1(models.Model):
'''
优惠券信息表:优惠劵 --> 商品id
''' title = models.CharField(max_length=32)
object_id = models.ForeignKey(to="Table",to_field="object_id") class Table(models.Model):
'''
表关系:商品id --> 所在表
'''
object_id = models.IntegerField()
table_id = models.IntegerField()
在食物和水果两张表分表建立多对多关系,将商品表和表关系Table建立关联:
table = models.ManyToManyField(to="Table", )
这样看起来是不是有些复杂呢,对于这种关联关系Content_Type就可以给我们解决,不需要创建多余表
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey,GenericRelation class Food(models.Model): title = models.CharField(max_length=32)
# 只实现relation关系 是隐形关系 不生成实际字段 只用于反向查询
coupons = GenericRelation(to="Coupon") class Fruit(models.Model): title = models.CharField(max_length=32)
# 只实现relation关系 是隐形关系 不生成实际字段 只用于反向查询
coupons = GenericRelation(to="Coupon" class Coupon(models.Model): title = models.CharField(max_length=32) content_type = models.ForeignKey(to=ContentType, on_delete=models.CASCADE)
object_id = models.IntegerField()
# 只实现relation关系 是隐形关系 不生成实际字段 只用于反向查询
content_obj = GenericForeignKey("content_type","object_id") def __str__(self):
return self.title
这样看起来是不是就简单多了呢,现在进行数据库迁移,你会看到下面几个表:

django_content_type表是存储我们所有的关系表,app_label表示app名字,model对应具体表。我们创建的三个表也会在里面自动 生成

Content_Type的数据操作
1、增:
# =============== 增加数据
# 方式一:传统方法创建
coupon_obj1 = Coupon.objects.create(title="面包九五折", object_id=1,content_type_id=7)
coupon_obj2 = Coupon.objects.create(title="苹果九折", object_id=1,content_type_id=8)
coupon_obj1 = coupon_obj1.content_type
coupon_obj2 = coupon_obj2.content_type
print(coupon_obj1.app_labeled_name) # 方式二:
# 通过GenericForeignKey创建,GenericForeignKey会自动绑定到对应的content_type
Coupon.objects.create(title="双十一大减价全场一折",content_obj=food_obj)
2、查 # ================ 查询数据
# ========= 1、查询面包有多少优惠卷 coupons = food_obj.conupus.all()
print(coupons) # <QuerySet [<Coupon: 面包九五折>, <Coupon: 双十一大减价全场一折>, <Coupon: 面包九五折>,] # ========= 2、通过优惠券查询面包
coupons_obj = Coupon.objects.filter(object_id=1).first()
content_obj = coupons_obj.content_obj
print(content_obj.title) # 面包 # ======== 3、基于Content_Type找表模型 以便获取表的其他数据 # 此时content_obj就是ContentType的一个对象
content_obj = ContentType.objects.filter(app_label="demo",model="food").first() # 调用ContentType对象的model_class属性获取表模型
model_class = content_obj.model_class()
print(model_class.objects.all()) # <QuerySet [<Food: Food object (1)>, <Food: Food object (2)>]>
适用情景:
Content_Type组件适用于商城类项目,用于创建多个外键关系的表关系
Django :Content-Type组件的更多相关文章
- django之forms组件
在django中forms组件有其强大的功能,里面集合和众多的函数和方法:下面来看一下它的源码 """ Form classes """ f ...
- Django组件(五) Django之ContentType组件
基础使用 -contenttype组件 -django提供的一个快速连表操作的组件,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中. 当我们的项目做数据迁移后,会 ...
- django内置组件——ContentTypes
一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象 ...
- Ajax的原理及Django上传组件
title: Ajax的原理及Django上传组件 tags: Django --- Ajax的原理及Django上传组件 Ajax的原理 ajax 是异步JavaScript和xml ajax就是向 ...
- Django之Form组件
Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...
- Python之路【第二十一篇】:Django之Form组件
Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...
- 第十一篇:web之Django之Form组件
Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...
- python Django之Form组件
python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...
- Django之ContentType组件
一.理想表结构设计 1.初始构建 1. 场景刚过去的双12,很多电商平台都会对他们的商品进行打折促销活动的,那么我们如果要实现这样的一个场景,改如何设计我们的表? 2. 初始表设计 注释很重要,看看吧 ...
- Django之Form组件(一)
Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...
随机推荐
- 虚拟机体验NAS私人云全揭秘:序言——虚拟机体验NAS私人云缘由
"世界在新冠肺炎疫情后将永远改变",对于2020春天在全球蔓延的新冠肺炎疫情,美国前国务卿基辛格做了这样的评价.确实,也改变了我们.春节期间,本着少添乱的原则,响应国家号召,自我隔 ...
- vue如何添加jquery?
1.首选通过npm安装jquery? 2.在build/webpack.base.conf文件当中引入jquery <pre>module.exports = { ... resolve: ...
- [YII2] Activeform表单部分组件使用方法
文本框:textInput(); 密码框:passwordInput(); 单选框:radio(),radioList(); 复选框:checkbox(),checkboxList(); 下拉框:dr ...
- 归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对
面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出 ...
- 转载-linux内核长什么样
来源:Linux中国 今天,我来为大家解读一幅来自 TurnOff.us 的漫画 "InSide The Linux Kernel" . TurnOff.us是一个极客漫画网站,作 ...
- Dockerfile的简单人门编写之关于yum的问题
首先我们编写一个简单的Dockerfile的例子.不过再此之前大家得去把编写dockerfile的指令了解一下. 编写以 centos镜像为基础镜像,构建 http 服务,Dockerfile 要求删 ...
- 在 ubuntu20 上替换原有的源,解决下载软件慢的问题
处理方式 使用命令查看到所有的下载源 sudo gedit /etc/apt/sources.list 使用163的源替换掉原始的源 163:http://mirrors.163.com/ubuntu ...
- 47000名开发者每月产生30000个漏洞 微软是如何用AI排查的
目前微软共有 47000 多名开发人员,每月会产生将近 30000 个漏洞,而这些漏洞会存储在 100 多个 AzureDevOps 和 GitHub 仓库中,以便于在被黑客利用之前快速发现关键的漏洞 ...
- CSDN排名及积分规则
博客排行榜排名分值=个人Blog全部随笔与文章的阅读数之和+个人Blog全部评论数之和*10+个人所发表的评论数之和*50 CSDN博客积分计算规则: 1.每公布一篇原创或者翻译文章:可获得10分. ...
- CF1288C-Two Arrays (DP)
You are given two integers n and m. Calculate the number of pairs of arrays (a,b) such that: the len ...