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实现list反转实例汇总
Nov 11 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
Python的Bottle框架中获取制定cookie的教程
Apr 24 Python
在Python中使用dict和set方法的教程
Apr 27 Python
python简单实现刷新智联简历
Mar 30 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 Python
Django实现组合搜索的方法示例
Jan 23 Python
Python实现的堆排序算法示例
Apr 29 Python
Python自定义一个异常类的方法
Jun 27 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
Python用Jira库来操作Jira
Dec 28 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生成局部唯一识别码LUID的代码
2012/10/06 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
js设置默认时间跨度过程详解
2019/07/17 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
js实现验证码功能
2020/07/24 Javascript
Python计算三维矢量幅度的方法
2015/06/15 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
非功能性需求都包括哪些方面
2013/10/29 面试题
2014元旦晚会策划方案
2014/02/19 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
学校读书活动总结
2014/06/30 职场文书
授权委托书公证
2014/09/14 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
合作协议书模板
2014/10/10 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
会计求职信怎么写
2015/03/20 职场文书
聊聊redis-dump工具安装问题
2022/01/18 Redis
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript