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 实现数组list 添加、修改、删除的方法
Apr 04 Python
Python对象与引用的介绍
Jan 24 Python
python动态进度条的实现代码
Jul 03 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
python 读取修改pcap包的例子
Jul 23 Python
python gdal安装与简单使用
Aug 01 Python
Python 脚本的三种执行方式小结
Dec 21 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Python不支持 i ++ 语法的原因解析
Jul 22 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 Python
Django如何与Ajax交互
Apr 29 Python
pytorch DataLoader的num_workers参数与设置大小详解
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
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
php 表单数据的获取代码
2009/03/10 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
js实现查询商品案例
2020/07/22 Javascript
python查看微信好友是否删除自己
2016/12/19 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
python re的findall和finditer的区别详解
2020/11/15 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
实习生的自我评价
2014/01/08 职场文书
库房保管员岗位职责
2014/04/07 职场文书
工厂搬迁方案
2014/05/11 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
2014年统计工作总结
2014/11/21 职场文书