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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
Python读写zip压缩文件的方法
Aug 29 Python
Python的matplotlib绘图如何修改背景颜色的实现
Jul 16 Python
django如何通过类视图使用装饰器
Jul 24 Python
通过python检测字符串的字母
Feb 18 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
python rsa-oaep加密的示例代码
Sep 23 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 Python
python实现简单的聊天小程序
Jul 07 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
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
js页面跳转的常用方法整理
2013/10/18 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python字典操作简明总结
2015/04/13 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
Python中with及contextlib的用法详解
2017/06/08 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
详解python的argpare和click模块小结
2019/03/31 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
初入社会应届生求职信
2013/11/18 职场文书
公司年会晚宴演讲稿
2014/01/06 职场文书
怎么写好自荐书
2014/03/02 职场文书
海飞丝广告词
2014/03/20 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS