Django组件content-type使用方法详解
作者:Crazymagic 发布时间:2023-10-01 13:54:42
标签:django,组件,content-type
前言
一个表和多个表进行关联,但具体随着业务的加深,表不断的增加,关联的数量不断的增加,怎么通过一开始通过表的设计后,不在后期在修改表,彻底的解决这个问题呢呢
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
0
投稿
猜你喜欢
- 代码如下:--PK select * from sys.key_constraints where object_id = OBJECT_
- 核心代码:#!/usr/bin/python# -*- coding: UTF-8 -*-import smtplibimport osim
- 前言写过前端Javascript代码的同学肯定不会对console对象感到陌生,在调试的过程中我们经常会用console对象在控制台输出一些
- AdobeAdobe公司的标识1982年,40多岁的程序员约翰·沃诺克(John Warnock)和查尔斯·杰斯克(Charles Gesc
- 任何数据库系统都无法避免崩溃的状况,即使你使用了Clustered,双机热备等等,仍然无法完全根除系统中的单点故障,何况对于大部分用户来说,
- 各位工程师累了吗? 推荐一篇可以让你技术能力达到出神入化的网站"持久男"1.二维绘图a. 一维数据集用 Numpy nd
- 首先打击我的就是rpm安装,它告诉我发现了Mysql版本冲突,安装无法继续。我用rpm -q 查询后,想通过rpm -e 来删除系统自带的版
- SQL Server所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或
- 在做一些工作的时候,有时候会涉及到给图片加上水印,这个如果手动添加的话,效率太低了,通常选择代码完成。下面这个是给图像添加文字水印(图片水印
- argparse是python标准库里面用来处理命令行参数的库命令行参数分为位置参数和选项参数:位置参数就是程序根据该参数出现的位置来确定的
- 内置函数常用函数1.数学相关•abs(x)abs()返回一个数字的绝对值。如果给出复数,返回值就是该复数的模。>>>pri
- 1 create table test(coltest varchar(20))2 实现这一功能 的 sql 语句 s
- 最近,使用 golang 去管理本地应用的生命周期,期间有几个有趣的点,今天就一起看下。场景一我们来看看下面两个脚本会产
- python嵌套函数使用外部函数变量的方法,Python2和Python3均可使用python3 def b(): b = 1 def bc
- 但Insus.NET想到的是,从下面的SQL语句,就可以查询到数据库大小。因此分享于此。 代码如下:SELECT DB_NAME
- 有一个群友在群里问个如何快速搭建一个搜索引擎,在搜索之后我看到了这个代码所在Git:https://github.com/asciimoo/
- 字符串在 Python 中创建字符串对象非常容易。只要将所需的文本放入一对引号中,就完成了一个新字符串的创建(参见清单 1)。如果稍加思考的
- 本文实例讲述了javascript设置页面背景色及背景图片的方法。分享给大家供大家参考,具体如下:<!DOCTYPE HTML PUB
- JSON是一种轻量级的数据交换格式,各种语言都有良好的支持。字典是Python的一种数据结构。可以看成关联数组。有些时候我们需要设计到字典转
- 本文实例讲述了Python集中化管理平台Ansible介绍与YAML。分享给大家供大家参考,具体如下:一 中文社区http://ansibl