Django 组件content_type
content type: django内置组件,这个组件帮忙做连表操作(混搭连表)
适用场景:适用于一张表与多张表同时做关联的时候。直接导入就可以使用了。
关联数据库所有的表;可以快速插入数据,并且用反向查找就能快速查找到数据。
models.py文件建立表
- from django.db import models
- # Create your models here.
- 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='关联的表名称')
- object_id=models.IntegerField(verbose_name='关联的表中的数据行的ID')
- content_object=GenericForeignKey('content_type','object_id')
- # 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)
- """
views.py文件,进行数据插入和查看
- from django.shortcuts import render,HttpResponse
- # Create your views here.
- 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)
- #
- # obj1 = models.DegreeCourse.objects.filter(title='python').first()
- # models.PricePolicy.objects.create(price=19.9, period=60, content_object=obj2)
- #
- # obj1 = models.DegreeCourse.objects.filter(title='python').first()
- # models.PricePolicy.objects.create(price=29.9, period=90, content_object=obj3)
- # # 2 为学位课rest framework添加一个价格策略:一个月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('ok')
总结:
当一张表作为多个表的FK,并且只能选择其中一个或者几个时,就可以使用content_type表;例如上面的优惠券表,被食物和衣服当作FK,数据库表一旦建立就难以更改,如果以后需要增加电器等表并把优惠券表作为FK表,这时就不能做到在优惠券表增加列字段electr_id,因为表只能增加行记录而不能增加列字段,因此就可以使用content_type表来将表与表中的对象进行关联,从而做到不增加列字段的情况下增加FK关系。
在使用content_type表时,需要在FK表中增加content_type作为FK字段,并增加GenericForeignKey便于优惠券表记录的建立以及单个优惠券对象对应的其他商品的查找。在优惠券表关联的“一”的关系表中增加GenericRelation字段便于查找关联的优惠券记录的查找
Django 组件content_type的更多相关文章
- Django 组件之 ----- content-type
Django 组件之 content-type的使用 一个表和多个表进行关联,但具体随着业务的加深,表不断的增加,关联的数量不断的增加,怎么通过一开始通过表的设计后,不在后期在修改表,彻底的解决这个问 ...
- 19,django组件之contenttype(一)
django组件之contenttype(一) 方式1:适用于1张表和另一张表要关联的时候. 1.路飞学成表设计: 2.将2个价格策略表合并1张表. 3.如果再加一张表,那价格策略表的表结构会发生改变 ...
- 05 django组件:contenttype
1.django组件:contenttype 组件的作用:可以通过两个字段让表和N张表创建FK关系 1.专题课,学位课 如何关联 过期时间?? 方法1:分别创建 专题课--过期时间表 .学位课--过期 ...
- python 全栈开发,Day78(Django组件-forms组件)
一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...
- python 全栈开发,Day76(Django组件-cookie,session)
昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...
- Django组件补充(缓存,信号,序列化)
Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...
- Django - 文件上传、Django组件 - 分页器(paginator)
一.文件上传准备知识 - Content-Type 1.请求头 - Content-Type Content-Type指的是请求体的编码类型,常见的类型共有3种: 1)application/x-ww ...
- Django组件-cookie,session
昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反 ...
- Django组件---Django请求生命周期和中间件
Django组件---Django请求生命周期和中间件 Django请求生命周期 说明: client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了sock ...
随机推荐
- LA 7277 Landscaping(最小割)
https://vjudge.net/problem/UVALive-7277 题意: 给出一个n*m的地图,.代表低坡,#代表高坡. 现在有n+m辆车分别从上端和左端出发,如果在行驶的过程中需要转换 ...
- Gym - 100283F Bakkar In The Army(二分)
https://vjudge.net/problem/Gym-100283F 题意: 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 .... 给出这样的序列,然后给出一个n,计算从1 ...
- UVa 12549 机器人警卫(最小点覆盖)
https://vjudge.net/problem/UVA-12549 题意: 在一个Y行X列的网格里有空地(.),重要位置(*)和障碍物(#),用最少的机器人看守所有重要位置,每个机器人要放在一个 ...
- Sublime编辑器上的Linux Vim插件常用快捷键
Sublime编辑器上的 Vim 插件常用快捷键 vim 的设置: 在Reference-> User Settings(首选项--> 设置用户) 选项,点击进入配置文件编辑状态,默认的用 ...
- Python中通过多个字符分割(split)字符串的方法--转载
Python中字符串自带的split方法一次只能使用一个字符对字符串进行分割,但是python的正则模块则可以实现多个字符分割 import re re.split('_#|','this_is#a| ...
- javascript method.
//**************************************************************** //* 名 称:DataLength //* 功 能:计算数据的长 ...
- vue项目打包部署到nginx 服务器上
假如要实现的效果如下 http://ip/vue =>是进入首页访问的路径是 usr/local/nginx/html/vue http://ip/website =>是进 ...
- 递归--练习4--noi666放苹果
递归--练习4--noi666放苹果 一.心得 写出状态后勇敢假设 二.题目 666:放苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允 ...
- 优化--前端(全占课,未完成作业:);CDN; Http/2的设置(未完成)
前端效能: 关键渲染路径:Google 文档 JavaScript 加载最佳化 让html和javascript同时渲染: 设置<script>的async或者defer属性(boolea ...
- Python+Flask+MysqL的web建设技术过程
一.前言(个人学期总结) 个人总结一下这学期对于Python+Flask+MysqL的web建设技术过程的学习体会,Flask小辣椒框架相对于其他框架而言,更加稳定,不会有莫名其妙的错误,容错性强,运 ...