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网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 Python
初步认识Python中的列表与位运算符
Oct 12 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 Python
Django框架实现逆向解析url的方法
Jul 04 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
Django中的cookie和session
Aug 27 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
python实现梯度法 python最速下降法
Mar 24 Python
python实现登录与注册系统
Nov 30 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 06 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
第十三节 对象串行化 [13]
2006/10/09 PHP
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
document.documentElement && document.documentElement.scrollTop
2007/12/01 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
浅析vue中的nextTick
2020/12/28 Vue.js
Python实现优先级队列结构的方法详解
2016/06/02 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
python邮件发送smtplib使用详解
2020/06/16 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
python web框架 django wsgi原理解析
2019/08/20 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
墨西哥购物网站:Elektra
2020/01/21 全球购物
大学生个人简历自我评价
2013/11/16 职场文书
员工考核管理制度
2014/02/02 职场文书
婚前财产公证书
2014/04/10 职场文书
农村党员一句话承诺
2014/05/30 职场文书
学习计划书怎么写
2014/09/15 职场文书
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python