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的Supervisor进行进程监控以及自动启动
May 29 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
python自动化生成IOS的图标
Nov 13 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
May 27 Python
深入浅析python的第三方库pandas
Feb 13 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
Feb 17 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
python初步实现word2vec操作
Jun 09 Python
利用python 读写csv文件
Sep 10 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 cli换行示例
2014/04/22 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
解javascript 混淆加密收藏
2009/01/16 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
2种简单的js倒计时方式
2017/10/20 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
原生js实现日历效果
2020/03/02 Javascript
Python 字符串定义
2009/09/25 Python
Python变量赋值的秘密分享
2018/04/03 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
如何理解python中数字列表
2020/05/29 Python
python之语音识别speech模块
2020/09/09 Python
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
环境工程专业个人求职信
2013/12/05 职场文书
工程建设实施方案
2014/03/14 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技