12.Django组件之Content_Type

1.帮助我们生成了一张表,里面有所有表名.这样不再自建表在表中填表名,用Foreignkey获取
2.为了让我们快速进入插入数据,填写一个字段GenericForeignKey,(不用生成字段)
3.为了让我们快速反向查找,通过添加字段GenericRelation,(仅仅用于反向查找,不生成字段)
  • 内置组件,用于帮助我们做连表操作.需求展示:
  • 学习商城分学位课和普通课,学位课有老师提供在线解答,在线解答每个月费用如下表.普通课程不提供在线解答,只提供视频.但观看视频每月需要办理会员.现将2个价格策略表,合成一张表,如下:

  • 但是如果又有新的服务:比如开了VVIP课程,那么价格策略表又增加一个字段.这样以后添加新服务就要修改表结构.不断更改表结构.这样并不好.

  • 修改如下方法更加好:

  • 这样以后无论增加什么样服务,只需增加字段.这种方式适用于一张表同时关联多张表.

  • 表的创建models.py:

from django.contrib.contenttypes.fields import GenericForeignKey
from django.db import models
from django.contrib.contenttypes.models import ContentType
# Create your models here. class Course(models.Model):
"""
普通课程
"""
title = models.CharField(max_length=32) class DegreeCourse(models.Model):
"""
学位课程
"""
title = models.CharField(max_length=32) class PricePolicy(models.Model):
"""
价格策略
"""
price = models.IntegerField()
period = models.IntegerField()
#ContentType会自己创建一张表,将所有表名称添加到该表中
content_type = models.ForeignKey(ContentType,verbose_name="关联普通课或学位课表")
object_id = models.IntegerField(verbose_name="关联普通课或学位课中的课程ID")
#帮助你快速实现content_type操作,会自定将
#obj = DegreeCourse.objects.filter(title="python全栈").first()
#GenericForeignKey能够帮助我们:从数据库获取该对象obj的id和此对象对应content_type表里面的id.赋值到该表的
#content_type和object_id
content_object = GenericForeignKey("content_type","object_id") #urls.py
url(r'^test/', views.test),
#views.py
from django.shortcuts import render,HttpResponse
from api import models
# Create your views here. def test(request):
""" """
#创建1个月的价格
obj1 = models.DegreeCourse.objects.filter(title="python全栈").first()
models.PricePolicy.objects.create(price=9.9,period=30,content_object=obj1)
#创建2个月的价格
obj2 = models.DegreeCourse.objects.filter(title="python全栈").first()
models.PricePolicy.objects.create(price=15.9, period=60, content_object=obj2)
#创建3个月的价格
obj3 = models.DegreeCourse.objects.filter(title="python全栈").first()
models.PricePolicy.objects.create(price=21.9, period=90, content_object=obj3)
return HttpResponse("200 OK")
  • 添加成功:

  • 快速反向查找:

#需要在models.py被查找的表中添加字段:
price_policy_list = GenericRelation("PricePolicy")#仅仅用于反向查找,不生成字段 #在views.py
#获取所有课程的价格策略:
dero = models.DegreeCourse.objects.fliter(id=1).frist()
price_policys=dero.price_policy_list.all()
#获取到每个价格对象.
print(price_policys)#<QuerySet [<PricePolicy: PricePolicy object>, <PricePolicy: PricePolicy object>, <PricePolicy: PricePolicy object>]>

Django:内置组件Content-Type的更多相关文章

  1. django内置组件——ContentTypes

    一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象 ...

  2. Vue基础(环境配置、内部指令、全局API、选项、内置组件)

    1.环境配置 安装VsCode 安装包管理工具:直接下载 NodeJS 进行安装即可,NodeJS自带 Npm 包管理工具,下载地址:https://nodejs.org/en/download/安装 ...

  3. Django学习——ajax发送其他请求、上传文件(ajax和form两种方式)、ajax上传json格式、 Django内置序列化(了解)、分页器的使用

    1 ajax发送其他请求 1 写在form表单 submit和button会触发提交 <form action=""> </form> 注释 2 使用inp ...

  4. Django内置Admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...

  5. Django内置模版过滤器

    Django内置过滤器总览 可以查询下表来总览Django的内置过滤器: 过滤器 说明 add 加法 addslashes 添加斜杠 capfirst 首字母大写 center 文本居中 cut 切除 ...

  6. 框架----Django内置Admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...

  7. Django内置信号

    阅读目录(Content) Django中内置的signal 自定义信号 1.定义信号 2.注册信号 3.触发信号 回到顶部(go to top) Django中内置的signal Django中提供 ...

  8. Django内置Admin解析

    Django 内置的admin是对于model中对应的数据表进行增删改查提供的组建 一.Django admin的内部依赖: 依赖的app django.contrib.auth django.con ...

  9. form-create教程:给内置组件和自定义组件添加事件

    本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ...

随机推荐

  1. Python3用多线程替代for循环提升程序运行速度

    [本文出自天外归云的博客园] 优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from thre ...

  2. sublime的注册方法 非常好用

    摘自:https://blog.csdn.net/weixin_42444922/article/details/81006107 转载 阿东的天空之城 发布于2018-07-11 20:03:43 ...

  3. elasticsearch 搜索提示DSL

    1,创建mapping: PUT /news_website { "mappings": { "news" : { "properties" ...

  4. 生成pcf文件

    import os import datetime import hashlib def checksum(filename): with open(filename, mode='rb') as f ...

  5. Mac home目录下,创建文件夹,修改权限

    http://php-note.com/article/detail/35e782e145a94042923946cb142b5cd1 1.关闭 SIP 2.sudo mount -uw /

  6. [转]Gnome桌面的录屏插件easyscreencast

    原文地址:https://www.linuxprobe.com/gnome-easyscreencast.html

  7. 怎么去掉织梦(dedecms)网站首页默认携带的index.html尾巴

    如果你的网站带小尾巴,比如这样的 那你就要注意了,因为这会导致搜索引擎会认为和不带尾巴的页面是两个页面,都会参与排名,会分散首页的权重. 那我们怎么去除呢? 方法1: 1)在空间面板里面找到默认首页设 ...

  8. Git 查看更改

    当向仓库中添加文件或删除文件后,可能需要查看更改. 查看更改有多种方式. 1.查看状态 # git status 结果 1 2 # 位于分支 master 无文件要提交,干净的工作区 2.查看日志 # ...

  9. mysql8.0 grant 创建账号及权限记录

    针对 42000错误 原文:https://stackoverflow.com/questions/50177216/how-to-grant-all-privileges-to-root-user- ...

  10. WIFI-Direct(Wifi直连)、AirPlay、DLAN、Miracast功能介绍

    不知道大家对无线同屏技术有多少了解,当这种技术普及的时候,我想我们的工作与生活又会方便很多吧!下面是目前三种主流同屏技术的介绍: 目前这种将终端信号经由WiFi传输到电视.电视盒的技术有三种:DLNA ...