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 相关文章推荐
python数据结构树和二叉树简介
Apr 29 Python
python多线程用法实例详解
Jan 15 Python
Python实现登录人人网并抓取新鲜事的方法
May 11 Python
python 数据的清理行为实例详解
Jul 12 Python
浅析Python pandas模块输出每行中间省略号问题
Jul 03 Python
python ddt数据驱动最简实例代码
Feb 22 Python
numpy下的flatten()函数用法详解
May 27 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
如何基于python操作json文件获取内容
Dec 24 Python
python scatter函数用法实例详解
Feb 11 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
判断是否为指定长度内字符串的php函数
2010/02/16 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
js函数返回多个返回值的示例代码
2013/11/05 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
2016/12/15 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
英国鲜花递送:Blossoming Gifts
2020/07/10 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
七一表彰活动方案
2014/01/18 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
公司委托书范本5篇
2014/09/20 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
python基础之停用词过滤详解
2021/04/21 Python
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
python批量创建变量并赋值操作
2021/06/03 Python
MySQL 开窗函数
2022/02/15 MySQL