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提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...
随机推荐
- wait,waitpid的学习使用
man wait man waitpid 从中可知 函数原型 pid_t wait(int* status); pid_t waitpid(pid_t pid, int* status, int op ...
- java学习(第一篇)
Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式 ...
- Mac文件上传下载到服务器指定命令
下载文件夹 scp -r 远程登录服务器用户名@远程服务器ip地址:/下载文件夹的目录 『空格』 本地目录 下载文件 scp 远程登录服务器用户名@远程服务器ip地址:/下载文件的 ...
- 定了,这个vue.js开源项目,面试时,一定会考问
因为现在的网店,都是用的商城系统, 而实体店都是入座后,扫码打开网上商城进行选购(餐饮,超市等),所以,vue.js迅速开发网上购物商城系统成为了香饽饽, 本人开源2020年4月开发的购物商城系统, ...
- WebRTC 及点对点网络通信机制
原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 这是 JavaScript 工作原理第十八章. 概述 何为 WebRTC ?首先,字面上已经给出了关于 ...
- Windows10中打开git bash闪退解决方案
重装系统后打开gitbash莫名其妙闪退... 究其原因,好像是盗版系统的null.sys文件损坏 那就在这里附上null.sys文件的下载链接: https://pan.baidu.com/s/1V ...
- 关于SpringBoot集成myBatis时,mapper接口注入失败的问题
问题描述: 在Spring Boot集成myBatis时,发现启动时,mapper接口一直注入失败. 现象如下: VehicleDAO就是需要的mapper对象,一个简单的接口. 已经在applica ...
- Kubernetes-在Kubernetes集群上搭建HBase集群
经过3天的努力,终于在Kubernetes上把HBase集群搭建起来了,搭建步骤如下. 创建HBase镜像 配置文件包含core-site.xml.hbase-site.xml.hdfs-site ...
- 从零开始搭建口袋妖怪管理系统(4)-借助webpack4.6工程化项目(上)
"手动是不可能手动的了,这辈子都不可能手动的了." 一.目标 上一章我们借助ngRoute,完成了口袋妖怪SPA系统的多模块导航开发,但是现在引用的东西越来越多,项目文件目录开始变 ...
- R 语言命令行参数处理
在unix.windows外部需要调用R脚本执行,然后又需要输入不同的参数,类似shell脚本的命令行参数输入,可以使用Rcript命令实现. 命令格式:Rscript [options] [-e e ...