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实现扫描端口示例
Mar 29 Python
Python实现自动发送邮件功能
Mar 02 Python
Python编程实现线性回归和批量梯度下降法代码实例
Jan 04 Python
用python处理图片实现图像中的像素访问
May 04 Python
Python continue继续循环用法总结
Jun 10 Python
python语音识别实践之百度语音API
Aug 30 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
Python3安装pip工具的详细步骤
Oct 14 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
Python调用Windows命令打印文件
Feb 07 Python
python3中sorted函数里cmp参数改变详解
Mar 12 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 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中for循环语句的几种变型
2006/11/26 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
PHP生成条形图的方法
2014/12/10 PHP
laravel学习教程之存取器
2016/07/30 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
python学习必备知识汇总
2017/09/08 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
Python如何对齐字符串
2020/07/30 Python
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
.net开发工程师面试题
2014/02/25 面试题
九年级体育教学反思
2014/01/23 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
导游词欢迎词
2015/02/02 职场文书
员工自我评价范文
2015/03/11 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
《去年的树》教学反思
2016/02/18 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python