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组件的更多相关文章

  1. django之forms组件

    在django中forms组件有其强大的功能,里面集合和众多的函数和方法:下面来看一下它的源码 """ Form classes """ f ...

  2. Django组件(五) Django之ContentType组件

    基础使用 -contenttype组件 -django提供的一个快速连表操作的组件,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中. 当我们的项目做数据迁移后,会 ...

  3. django内置组件——ContentTypes

    一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象 ...

  4. Ajax的原理及Django上传组件

    title: Ajax的原理及Django上传组件 tags: Django --- Ajax的原理及Django上传组件 Ajax的原理 ajax 是异步JavaScript和xml ajax就是向 ...

  5. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  6. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  7. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

  8. python Django之Form组件

    python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...

  9. Django之ContentType组件

    一.理想表结构设计 1.初始构建 1. 场景刚过去的双12,很多电商平台都会对他们的商品进行打折促销活动的,那么我们如果要实现这样的一个场景,改如何设计我们的表? 2. 初始表设计 注释很重要,看看吧 ...

  10. Django之Form组件(一)

    Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...

随机推荐

  1. 4.加密与token(node+express)

    一. 敏感数据加密1.安装并引入中间件     npm install utility     const utils = require('utility')2.加密方法     function ...

  2. [Php][linux][nginx] 安装总结

    就想总结一份安装环境文档,因为文档很多问题也很多,总结一份自己的安装文档! 首先,环境CentOS7,linux环境,windows! 1. 网络配置! vi /etc/sysconfig/netwo ...

  3. liunx常用知识基本命令大全

    liunx基础命令使用 标签(空格分隔):liunx常用命令 网络配置 虚拟网卡的绝对路径 /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ...

  4. markdownPad常用功能示例

    1.列表 无序列表 姓名 张三 李四 王五 有序列表 张三 李四 王五 2.超链接 百度 3.引用 锄禾日当午,汗滴禾下土.谁知盘中餐,粒粒皆辛苦. -- 李绅<古风二首> 4.简要修饰文 ...

  5. 获取磁盘的 总容量,空余容量,已用容量 【windows】

    使用windows api 输入:盘符字符串 输出:磁盘容量 float get_disk_spaces(const char drive_letter, float & total_spac ...

  6. [Windows] Diskpart Scripts and Examples

    https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/diskpart-scripts-and ...

  7. 更加安全的密钥生成方法Diffie-Hellman

    更加安全的密钥生成方法Diffie-Hellman 之前我们谈到了密钥配送的问题,这个世界是如此的危险, 一不小心通信线路就会被监听,那么我们怎么在这种不安全的线路中传递密钥呢? 这里我们介绍一下Di ...

  8. 汉字编码对照表(gb2312/Big5/GB2312)

    一.汉字编码的种类 1.GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆.新加坡等地也使用此编码.它是一个简化字的编码规范,当然也包括其他的符号.字母.日文假名等,共74 ...

  9. 对话Roadstar投资人:一家自动驾驶公司之死(三) ...

    11. Roadstar 如何收场? 雷锋网:你觉得 Roadstar 造成今天这样的局面,是什么导致的? 投资人代表 1:刚才我们也数次表达了,在每个人身上,可能每个人的诉求,不能达到同步,与公司的 ...

  10. Linux监听磁盘使用情况

    前阵子服务器磁盘写满了,导致项目出了很多奇怪的问题,比如文件上传不了(这个很好理解),还有登录时验证码无法加载(现在依旧不知道原因,项目的验证码图片是只在内存中生成的BufferedImage对象,不 ...