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 相关文章推荐
python3获取当前文件的上一级目录实例
Apr 26 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
Python属性和内建属性实例解析
Jan 14 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
pytorch损失反向传播后梯度为none的问题
May 12 Python
python之json文件转xml文件案例讲解
Aug 07 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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实现的生成静态HTML速度快类库
2007/03/31 PHP
php 获取本地IP代码
2013/06/23 PHP
php ios推送(代码)
2013/07/01 PHP
PHP实现的带超时功能get_headers函数
2015/02/10 PHP
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
集团薪酬管理制度
2014/01/13 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
《雾凇》教学反思
2014/02/17 职场文书
小学六年级学生评语
2014/04/22 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
2015年国培研修感言
2015/08/01 职场文书
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
Python预测分词的实现
2021/06/18 Python
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers