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中Collection的使用小技巧
Aug 18 Python
使用url_helper简化Python中Django框架的url配置教程
May 30 Python
python用reduce和map把字符串转为数字的方法
Dec 19 Python
Python优先队列实现方法示例
Sep 21 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 Python
jupyter notebook 增加kernel教程
Apr 10 Python
python如何绘制疫情图
Sep 16 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 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 Socket 编程模拟Http post和get请求
2014/11/25 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
隐性调用php程序的方法
2015/06/13 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
JavaScript 数组运用实现代码
2010/04/13 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
化学教学随笔感言
2014/02/19 职场文书
班长竞选演讲稿
2014/04/24 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
标枪加油稿
2015/07/22 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
新手入门Mysql--概念
2021/06/18 MySQL
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers