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计算最小优先级队列代码分享
Dec 18 Python
寻找网站后台地址的python脚本
Sep 01 Python
python中使用mysql数据库详细介绍
Mar 27 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
Jun 07 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
Tensorflow 查看变量的值方法
Jun 14 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
python实现把二维列表变为一维列表的方法分析
Oct 08 Python
python实点云分割k-means(sklearn)详解
May 28 Python
Python下划线5种含义代码实例解析
Jul 10 Python
python+openCV对视频进行截取的实现
Nov 27 Python
Python OpenCV超详细讲解基本功能
Apr 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 tp验证表单与自动填充函数代码
2012/02/22 PHP
php创建sprite
2014/02/11 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
javascript 写类方式之三
2009/07/05 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
python excel转换csv代码实例
2019/08/26 Python
python能开发游戏吗
2020/06/11 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
安全生产实施方案
2014/02/23 职场文书
节约用水标语
2014/06/11 职场文书
化工实习心得体会
2014/09/09 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
从事会计工作年限证明
2015/06/23 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
详解MySQL的半同步
2021/04/22 MySQL
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server