Django组件content-type使用方法详解


Posted in Python onJuly 19, 2019

前言

一个表和多个表进行关联,但具体随着业务的加深,表不断的增加,关联的数量不断的增加,怎么通过一开始通过表的设计后,不在后期在修改表,彻底的解决这个问题呢呢

django中的一个组件content-type可以帮助我们解决这样的一个问题

在这里我先设计了3张表 学位表 普通课程 和价格策略表 大致的设计如下

Django组件content-type使用方法详解

在上图中我们可以看到价格策略表和其他的两个表进行了关联,可以根据表明

models.py

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType


class Course(models.Model):
  """
  普通课程
  """
  title = models.CharField(max_length=32)
  # 仅用于反向查找 不在数据库中添加字段
  price_policy_list = GenericRelation("PricePolicy")

class DegreeCourse(models.Model):
  """
  学位课程
  """
  title = models.CharField(max_length=32)

  # 仅用于反向查找
  price_policy_list = GenericRelation("PricePolicy")


class PricePolicy(models.Model):
  """
  价格策略
  """
  price = models.IntegerField()
  period = models.IntegerField()

  # 关联表
  content_type = models.ForeignKey(ContentType, verbose_name='关联的表名称') # 7,8 表名称
  object_id = models.IntegerField(verbose_name='关联的表中的数据行的ID')  #
  # 帮助你快速实现content_type操作 ,快速插入数据 不生成数据库中的字段 
  content_object = GenericForeignKey('content_type', 'object_id')

进行插入数据的类视图

from django.shortcuts import render,HttpResponse
from app01 import models
def test(request):

  # 1. 为学位课“Python全栈”添加一个价格策略:一个月 9.9
  # obj1 = models.DegreeCourse.objects.filter(title='Python全栈').first()
  # models.PricePolicy.objects.create(price=9.9, period=30, content_object=obj1)
  #
  # obj2 = models.DegreeCourse.objects.filter(title='Python全栈').first()
  # models.PricePolicy.objects.create(price=19.9, period=60, content_object=obj2)
  #
  # obj3 = models.DegreeCourse.objects.filter(title='Python全栈').first()
  # models.PricePolicy.objects.create(price=29.9, period=90, content_object=obj3)

  # 2. 为学位课“rest”添加一个价格策略:一个月 9.9
  # obj1 = models.Course.objects.filter(title='rest framework').first()
  # models.PricePolicy.objects.create(price=9.9, period=30, content_object=obj1)
  #
  # obj2 = models.Course.objects.filter(title='rest framework').first()
  # models.PricePolicy.objects.create(price=19.9, period=60, content_object=obj2)
  #
  # obj3 = models.Course.objects.filter(title='rest framework').first()
  # models.PricePolicy.objects.create(price=29.9, period=90, content_object=obj3)

  # 3. 根据课程ID获取课程, 并获取该课程的所有价格策略
  # course = models.Course.objects.filter(id=1).first()
  #
  # price_policys = course.price_policy_list.all()
  #
  # print(price_policys)


  return HttpResponse('...')

为其添加路由

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^test/', views.test),
]

我们自己进行插入数据可能会这样写

# 1. 为学位课“Python全栈”添加一个价格策略:一个月 9.9
"""
obj = DegreeCourse.objects.filter(title='Python全栈').first()
# obj.id
cobj = ContentType.objects.filter(model='course').first()
# cobj.id
PricePolicy.objects.create(price='9.9',period='30',content_type_id=cobj.id,object_id=obj.id)
"""
# obj = DegreeCourse.objects.filter(title='Python全栈').first()
# PricePolicy.objects.create(price='9.9',period='30',content_object=obj)

输入以下的地址进行测试

http://127.0.0.1:8000/test

数据库中的结果如下

Django组件content-type使用方法详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pygame 精灵的行走及二段跳的实现方法(必看篇)
Jul 10 Python
使用tensorflow实现线性回归
Sep 08 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
Python异常处理例题整理
Jul 07 Python
Django分页功能的实现代码详解
Jul 29 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
python实现从wind导入数据
Dec 03 Python
浅析NumPy 切片和索引
Sep 02 Python
Python字典实现伪切片功能
Oct 28 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 #Python
django admin组件使用方法详解
Jul 19 #Python
使用python分析统计自己微信朋友的信息
Jul 19 #Python
django url到views参数传递的实例
Jul 19 #Python
Django  ORM 练习题及答案
Jul 19 #Python
Django之提交表单与前后端交互的方法
Jul 19 #Python
解决Python3 抓取微信账单信息问题
Jul 19 #Python
You might like
基于Zend的Captcha机制的应用
2013/05/02 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
MVVM 双向绑定的实现代码
2018/06/21 Javascript
jQuery实现轮播图及其原理详解
2020/04/12 jQuery
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
Windows下安装python2.7及科学计算套装
2015/03/05 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Python实现时间序列可视化的方法
2019/08/06 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
如何安装ruby on rails
2014/02/09 面试题
制药工程专业毕业生推荐信
2013/12/24 职场文书
酒鬼酒广告词
2014/03/21 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python