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中的True,False条件判断实例分析
Jan 12 Python
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
Python实现数据库编程方法详解
Jun 09 Python
python Django批量导入数据
Mar 25 Python
使用Python对Access读写操作
Mar 30 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
python playwright 自动等待和断言详解
Nov 27 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
人族 Terran 基本策略
2020/03/14 星际争霸
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
php-msf源码详解
2017/12/25 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
初一科学教学反思
2014/01/27 职场文书
医学专业职业生涯规划范文
2014/02/05 职场文书
简单的项目建议书模板
2014/03/12 职场文书
三八节主持词
2014/03/17 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
结婚保证书
2015/01/16 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
大学生实习介绍信
2015/05/05 职场文书
教务处干事工作总结
2015/08/14 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
ant design charts 获取后端接口数据展示
2022/05/25 Javascript
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS