Django中content-type组件的使用
content-type组件
ContentType是Django的内置的一个应用,可以追踪项目的所有APP和model的对应关系,并记录在ContentTpe表中,当我们的项目做数据迁移后,会有很多django自带的表,其中就有django_content_type表
使用场景
网上商城购物时,会有各种各样的优惠卷,比如通用优惠卷,满减卷,或者仅限特定品类的优惠卷,我们以往的方式是在数据库中,通过外键将优惠卷和不同品类的商品表关联起来
from django.db import models
class Electrics(models.Model):
'''
id name
1 格力空调
2 小天鹅洗衣机
3 好太太洗碗机
'''
name = models.CharField(max_length=32)
class Foods(models.Model):
'''
id name
1 肉松小贝
2 北京烤鸭
3 梨膏糖
'''
name=models.CharField(max_length=32)
class Clothers(model.Model):
name=models.CharField(max_lenght=32)
class Coupon(models.Model):
'''
id name Electrics Foods Clothes ...
1 通用优惠卷 null null null
2 冰箱满减 2 null null
3 面包狂欢节 null 1 null
'''
name =models.CharField(max_length=32)
electric_obj=models.ForeignKey(to='Electrics',null=True)
food_obj=models.ForeignKey(to='Foods',null=True)
cloth_obj=models.ForeignKey(to='Clothes',null=True)
将所有的商品都关联到Coupon这张表中,如果是通用优惠卷,那么所有的ForeignKey对应字段的值为null,如果仅限某些商品,那么对应商品ForeignKey记录该商品的id,不相干的记录为null
存在的问题
1、实际中商品种类繁多,而且很可能还会持续增加,那么优惠卷标中的外键越来越多,需要频繁的修改表
2、每条记录仅使用其中的一个或几个外键字段,这样就会造成表空间的浪费
解决方法
- 在model中定义ForeignKey字段,并关联到ContentType表,通常这个字段命名为content-type
- 在model中定义PositiveIntergerField字段,用来存储关联表中的主键,通常用object_id
- 在model中定义GenericForeignKey字段,传入上面两个字段,反向查询定义GenericRelation
from django.db import models
from django.contrib.contenttypes.models improt ContentType
from django.contrib,contenttypes.models import GenericForeignKey
class Electrics(models.Model):
name=models.CharField(max_length=32)
coupons=GenericRelation(to='Coupon')
def __str__(self):
return self.name
class Foods(models.Model):
name=models.CharField(max_length=32)
coupons=GenericRelation(to='Coupon')
def __str__(self):
return self.name
class Clothes(models.Model):
name=models.CharField(max_length=32)
coupons=GenericRelation(to='Coupon')
def __str__(self):
return self.name
class Coupon(models.Model):
name=models.CharField(max_length=32)
content_type=models.ForeignKey(to=ContentType)
object_id=models.PositiveInterField()
content_object=GenericForeignKey('content_type','object_id')
def __str__(self):
return self.name
from django.shortcuts import render,HttpResponse
from app01 import models
from django.contrib.contenttypes.models import ContentType
def text(request):
if request.method=='GET':
content=ContentType.objects.filter(app_label='app01',model='electrics').first()
cloth_class=content.model_class() #相当于models.Electrics
res=cloth_class.object.all()
print(res)
##为三星电视(id=2)创建一条优惠记录
s_tv=models.Electrics.objects.filter(id=2).first()
models.Coupon.objects.create(name='电视优惠卷',content_object=s_tv)
##查询优惠卷(id=1)绑定了那些商品
coupon_obj=models.Coupon.objects.filter(id=1).first()
prod=coupon_obj.content_object
print(prod)
##查询三星电视(id=2)的所有优惠卷
res=s_tv.coupons.all()
print(res)
##查询obj的所有优惠卷:如果没有定义反向查询字段
content=ContentType.objects.filter(app_label='app01',model='model_name').first()
res=models.OftenAskedQuestion.objects.filter
(content_type=content,object_id=obj.pk).all()
return HttpResponse('pass')
总结
当一张表和多个表FK关联,并且多个FK中只能选择其中一个或其中n个时,可以利用contenttypes app,只需要定义三个子弹就搞定,常用场景还要:一个商品的多种优惠劵、一门课程按照周期的多种价格等等
Django中content-type组件的使用的更多相关文章
- Django中的form组件
Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...
- django中的forms组件
form介绍 用户需要向后端提交一些数据时,我们常常把这些数据放在一个form表单里,采用form标签,里面包含一些input等标签把用户的数据提交给后端. 在给后端提交数据的时候,我们常常也需要对于 ...
- django中的ajax组件
目录 django中的ajax 向服务器发送请求的途径 Ajax的特点 基于jquery实现的ajax请求 利用ajax实现计算器 利用ajax实现登陆认证 利用form表单进行文件上传 利用ajax ...
- Django中利用type动态操作数据库表
场景分析: 后台MySql数据库保存了一大批按股票代码命名的数据表,每张表保存的是每只股票的日线数据. stock_000002 stock_600030 stock_600020 ...一共3000 ...
- django中的forms组件(权限信息校验,增删改查)
1.用处 1.用户请求数据验证 2.自动生成错误信息 3.打包用户提交的正确信息 4.如果其中有一个错误了,其他的正确,则保留上次输入的内容 5.自动创建input标签并可以设置样式 6.基于form ...
- django中的分页器组件
目录 django的组件-分页器 引入分页器 分页器demo 创建数据库模型 url控制器 views视图函数 templates模板 为什么要用分页器 导入分页器 分页器优化1 分页器优化2 有多少 ...
- django中使用Form组件
内容: 1.Form组件介绍 2.Form组件常用字段 3.Form组件校验功能 4.Form组件内置正则校验 参考:https://www.cnblogs.com/liwenzhou/p/87478 ...
- Flask-wtforms类似django中的form组件
一.安装 pip3 install wtforms 二.简单使用 1.创建flask对象 from flask import Flask, render_template, request, redi ...
- Pyhon之Django中的Form组件
Pyhon之Django中的Form组件 新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面 ...
- Django中的admin组件分析
admin的使用介绍 django-admin的使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.可以在项目的 setting ...
随机推荐
- python命令行工具的使用——argparse
argparse是一个常用的库函数,使用它的时候我们在命令行中不仅仅可以运行python文件,更可以零时调整参数,十分方便. 首先,如果你只是希望传一丢丢数据进去,那么只看下面两行就行了 import ...
- 数据库 left()、length()函数
数据库 left().length()函数 1.Mysql的length()函数: length()函数主要用于计算字符串的长度,用法也很简单:length(要计算的字符串) 就可以计算出字符串的长度 ...
- vector内存分配简单介绍
众所周知,vector的size()其实并不代表它占用的空间,它实际占用空间可以用capacity()查看 众所周知,push_back()时,如果size==capacity则会使capacity从 ...
- 洛谷题解 P1134 【阶乘问题】
原题传送门 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600 12的阶乘最右边的非零位为6. ...
- React.js高阶函数的定义与使用
/* 高阶函数的简单定义与使用 一: 先定义一个普通组件 二: 用function higherOrder(WrappendComponent) { return } 将组件包裹起来,并用export ...
- 剑指offer-面试题29-顺时针打印矩阵-矩阵
/* 题目: 输入一个矩阵,按照从外到内顺时针的顺序依次打印每一个数字. */ /* 思路: 1.将打印矩阵看作是打印一个个从外向内的环. 2.每一个环都有一个起始节点,起始节点的坐标*2小于行数和列 ...
- vs2015配置cv文件,不用每次新建项目在配置
首先 选择空项目:新建完成后点击属性管理器 一定要确定你的环境是x86还是x64:我的是x64: 选择新的项目属性表 点击属性配置:配置cv的库目录.包含目录.链接器输入:可参考我前面的博文 Open ...
- simmon effect : build the funcion of trail list
#the real experiment for simon effect #load the library which is our need import pygame import sys i ...
- Docker最全教程——从理论到实战(十六)
前言 与其他语言相比,Go非常值得推荐和学习,真香!为什么?主要是可以直接编译成机器代码(性能优越,体积非常小,可达10来M,见实践教程图片)而且设计良好,上手门槛低.本篇主要侧重于讲解了Go语言的优 ...
- java性能分析 - CPU飙高分析工具
背景 有处理过生产问题的同学基本都能遇到系统忽然缓慢,CPU突然飙升,甚至整个应用请求不可用.当出现这种情况下,在不影响数据准确性的前提下,我们应该尽快导出jstack和内存信息,然后 ...