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 时间处理datetime实例
Sep 06 Python
PHP webshell检查工具 python实现代码
Sep 15 Python
Python3基础之条件与循环控制实例解析
Aug 13 Python
django的ORM模型的实现原理
Mar 04 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
python爬虫之自制英汉字典
Jun 24 Python
Django实现基于类的分页功能
Oct 31 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
python爬虫请求头设置代码
Jul 28 Python
Python远程linux执行命令实现
Nov 11 Python
Pandas搭配lambda组合使用详解
Jan 22 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编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
详解PHP数组赋值方法
2015/11/07 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
PHP递归的三种常用方式
2019/02/28 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
javascript self对象使用详解
2016/10/18 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
python抓取网页图片并放到指定文件夹
2014/04/24 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
Python自定义线程池实现方法分析
2018/02/07 Python
NumPy中的维度Axis详解
2019/11/26 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
C++面试题目
2013/06/25 面试题
自信主题班会
2015/08/14 职场文书
周一给客户的问候语
2015/11/10 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书