Django组件content-type使用方法详解
作者:Crazymagic 时间:2023-10-01 13:54:42
前言
一个表和多个表进行关联,但具体随着业务的加深,表不断的增加,关联的数量不断的增加,怎么通过一开始通过表的设计后,不在后期在修改表,彻底的解决这个问题呢呢
django中的一个组件content-type可以帮助我们解决这样的一个问题
在这里我先设计了3张表 学位表 普通课程 和价格策略表 大致的设计如下
在上图中我们可以看到价格策略表和其他的两个表进行了关联,可以根据表明
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
数据库中的结果如下
来源:https://www.cnblogs.com/crazymagic/p/9572223.html
标签:django,组件,content-type
0
投稿
猜你喜欢
python运行脚本文件的三种方法实例
2022-07-08 11:10:21
基于标准的web项目开发模式探索
2013-12-12 15:05:25
Python线程指南分享
2023-01-13 15:33:58
Python可视化神器pyecharts绘制仪表盘
2021-12-29 15:57:53
Mysql数据库性能优化三(分表、增量备份、还原)
2024-01-21 00:38:54
走中国特色的网站重构道路
2010-04-08 16:10:00
python实现将excel文件转化成CSV格式
2021-10-16 05:23:50
mysql提示Changed limits: max_open_files: 2048 max_connections: 1910 table_cache: 64的解决
2024-01-23 11:01:32
Django RestFramework 全局异常处理详解
2023-12-15 03:16:42
python爬虫正则表达式之处理换行符
2021-02-20 05:56:02
一些常用的Python爬虫技巧汇总
2021-01-02 22:51:56
Python装饰器用法实例总结
2022-09-27 01:26:23
使用xml http为网站增加域名查询功能
2008-05-29 13:42:00
Python环境下安装PyGame和PyOpenGL的方法
2021-12-09 10:14:38
PHP实现对数组分页处理实例详解
2023-11-21 07:08:13
MySQL 行转列详情
2024-01-22 18:19:58
用ADODB.Stream代替FSO读取/写入文本文件
2008-01-31 12:19:00
SQL点滴24 监测表的变化
2011-09-30 11:38:41
MySQL环境下导入数据时是否需要禁用索引
2009-01-04 12:42:00
python读取nc数据并绘图的方法实例
2023-09-16 10:08:19