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 Json序列化与反序列化的示例
Jan 31 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
Python csv文件的读写操作实例详解
Nov 19 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
Python使用Excel将数据写入多个sheet
May 16 Python
python中 _、__、__xx__()区别及使用场景
Jun 30 Python
Python实现EM算法实例代码
Oct 04 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 Python
Flask搭建一个API服务器的步骤
May 28 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 zip扩展Linux下安装过程分享
2014/05/05 PHP
9段PHP实用功能的代码推荐
2014/10/14 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
js图片处理示例代码
2014/05/12 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
jquery实现图片预加载
2015/12/25 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
利用python获得时间的实例说明
2013/03/25 Python
Python对切片命名的实现方法
2018/10/16 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
浅析Django中关于session的使用
2019/12/30 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
详解如何修改python中字典的键和值
2020/09/29 Python
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
五一服装活动方案
2014/01/11 职场文书
股权转让意向书
2014/04/01 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
六五普法学习心得体会
2016/01/21 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书