ContentType-设计课程表

# 数据:
"""
免费课:Python入门
学位课:Python全栈 价格策略:
Linux入门 7 0
Python入门 7 0
Python入门 14 9.9
Python入门 30 199
Python全栈 180 18888
Python全栈 240 23888
""" # 设计
""" 不合理
# Course表
# id name type price_policy normal_course degreecourse
1 Linux入门 免费课 1 有 空
2 Python入门 免费课 2 有 空
3 Python入门 免费课 3 有 空
4 Python全栈 学位课 4 空 有 # PricePolicy表
# id day price
1 7 0
2 7 0
3 14 9.9
4 180 18888
""" """
# Course表
# id name normal_course(该表独有的字段)
1 Linux入门 数据
2 Python入门 数据 # DegreeCourse表
# id name degreecourse(该表独有的字段)
1 Python全栈 数据 # PricePolicy表
# id day price couse_id course_type
1 7 0 1 免费课
2 7 0 2 免费课
3 14 9.9 2 免费课
4 180 18888 1 学位课 # 问题点:课程相关表的 主键 与 表名 两个信息 在价格策略表中
# 问题1:couse_id数据不具备唯一性,不能成为外键
# 问题2:couse_id与course_type能否生成联合唯一外键?
-- course_type是与表名有联系,并不是 课程相关表 的表字段
-- couse_id与course_type能不能保证唯一性
""" # 解决方案
"""
# Course表
# id name normal_course(该表独有的字段)
1 Linux入门 数据
2 Python入门 数据 # DegreeCourse表
# id name degreecourse(该表独有的字段)
1 Python全栈 数据 # PricePolicy表
# id day price couse_id course_type(外键)
1 7 0 1 1
2 7 0 2 1
3 14 9.9 2 1
4 180 18888 1 2 # TableName表 => ContentType
id table_name
1 course
2 degree_course ContentType解决的问题:一个表的两个字段与另外两张表有关联(关联关系是交叉的)
"""

ContentType-开发使用

"""
# Course表
# id name
1 Python入门 # DegreeCourse表
# id name
1 Python全栈 # PricePolicy表
# id day price couse_id course_type(外键)
1 7 0 1 1
2 14 9.9 1 1
3 180 18888 1 2 # ContentType表
id table_name
1 course
2 degreecourse
"""

models.py

from django.db import models

from django.contrib.contenttypes.fields import GenericRelation

class Course(models.Model):
name = models.CharField(max_length=32)
# price_policy = GenericRelation(to='PricePolicy',object_id_field='object_id',content_type_field='content_type')
# 当你的类GenericRelation关联的表PricePolicy中的字段和(object_id_field='object_id', content_type_field='content_type'),
# 字段名字完全一致时可以省略object_id_field和content_type_field的参数
price_policy = GenericRelation(to='PricePolicy') # 用户连表查询,不会在数据库中产生字段 class DegreeCourse(models.Model):
name = models.CharField(max_length=32)
price_policy = GenericRelation(to='PricePolicy') from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey class PricePolicy(models.Model):
day = models.IntegerField()
price = models.CharField(max_length=8)
# course_id = models.IntegerField() # 某课程表的主键,但是不具备唯一性,所以只能用IntegerField
# course_type = models.CharField(max_length=16) # 一会儿要改成外键
# course_type = models.ForeignKey(to=ContentType, null=True)
# model_object = GenericForeignKey(ct_field='course_type', fk_field='course_id')
object_id = models.IntegerField()
content_type = models.ForeignKey(to=ContentType, null=True)
# 改操作只用于ContentType连表查询,不会产生表字段,就是关联课程表的对象
# 当你在此类中有和GenericForeignKey所需要的参数(ct_field='content_type', fk_field='object_id'),
# 即ct_field和fk_field参数所需的字段名字完全一致时可以胜率这两个参数的值
model_object = GenericForeignKey()

Views.py

from django.shortcuts import HttpResponse
from api import models def add_course(request):
# 为python入门 免费课增加两条价格策略
# course = models.Course.objects.filter(pk=1).first()
# content_type = models.ContentType.objects.filter(model='course').first()# course应该写活
# models.PricePolicy.objects.create(day=7, price=0, course_id=course.pk, content_type=content_type)
# course = models.Course.objects.filter(pk=1).first()
# print(course._meta.model_name) # 为model对象表名小写
# content_type = models.ContentType.objects.filter(model=course._meta.model_name).first()
# models.PricePolicy.objects.create(day=14, price=9.9, course_id=course.pk, content_type=content_type) # 上述方法是在models.py中PricePolicy类中的course_id和course_type字段没有注释之前的方法
# 为Python全栈 学位课程添加一条价格策略 采用ContentType来实现
# degree_course = models.DegreeCourse.objects.filter(pk=1).first()
# models.PricePolicy.objects.create(day=180, price=18888, model_object=degree_course) # 查找所有课程的所有价格策略
# price_policy_list = models.PricePolicy.objects.all()
# for price_policy in price_policy_list:
# print(price_policy.model_object.name, price_policy.day, price_policy.price) # 查看Python入门的所有价格策略
course = models.Course.objects.filter(pk=1).first()
price_policy_list = course.price_policy.all()
for price_policy in price_policy_list:
print(course.name, price_policy.day, price_policy.price)
return HttpResponse('ok')

Django ContentType(ORM操作)的更多相关文章

  1. Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

  2. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  3. Django之ORM操作(***)

    Django之ORM操作(***) http请求的流程: url--> 视图view(模板+数据库) --> ORM的功能: 可以转换SQL语句,并做操作. ORM操作数据表: -创建表: ...

  4. 【Django】ORM操作#2

    目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...

  5. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  6. django的orm操作优化

    django的orm操作优化 models.py from django.db import models class Author(models.Model): name = models.Char ...

  7. Django中ORM操作

    ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...

  8. Django的ORM操作

    ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...

  9. Django之ORM操作总结

    Django之ORM总结 表结构 from django.db import models # 一对多:班级与学生 # 多对多:班级与老师 # Create your models here. #创建 ...

随机推荐

  1. 已废弃_CSDN慕零的黑夜-头条-第一期(必问)[导读:]1.CSDN必问赏金流向何方 2.CSDN必问偷偷做的手脚 3.CSDN必问靠谱吗 4.关于钱于回答的平衡问题:一美元拍卖骗局qq3461896724

    [本文有已知的链接差错,懒得改了] 本期是关于CSDN 必问 (biwen.csdn.net)的内容,欢迎评论文末,文中插入有 小姐姐 img(附py代码,1.49G) + coding资料 哟~~~ ...

  2. adb命令将抓包工具证书从用户目录移动至系统目录,解决反爬对于本地证书认证

    代码和注释 adb shell #连接手机进入shell模式 #su root #如果你不root权限可以试着这个一般都是root cd /data/misc/user/0/cacerts-added ...

  3. 利用JavaScript当鼠标点击导航时改变背景

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 计算机网络-网络层(6)ICMP协议

    互联网控制报文协议(ICMP,Internet Control Message Protocol),被主机和路由器用来彼此沟通网络层的信息 ICMP报文是承载在IP分组中的,即lCMP报文是作为IP有 ...

  5. 团队作业3:需求改进&系统设计

    一.需求&原型改进: 1.1 选题需求改进 用户:同学你好,有什么事我们能帮到你 我:我要说的事……(咽口水)你们千万别害怕 用户:我们是杠精,我们不会怕,您请说 我:我们要做一个roguel ...

  6. python chardet模块查看字符编码方式

    电脑配置:联想笔记本电脑 windows8系统 Python版本:2.7.8 本文章撰写时间:2014.12.25 作者:陈东陈 阅读说明: 1.本文都是先解释,后放图片: 2.文中斜体部分要么为需要 ...

  7. 学生成绩管理系统(SSM+MySQL+JSP)

    开发工具:Eclipse前端技术:基础:html+css+JavaScript框架:JQuery+H-ui后端技术:Spring+SpringMVC+mybatis模板引擎:JSP数据库:mysql ...

  8. MPI小例子

    MPI示例 MPI时间函数测试 #include<stdio.h> #include<mpi.h> #include<stdlib.h> #include<t ...

  9. W3C标准和语义化

    一.语义化的理解 根据内容选择合适的标签,便于开发者阅读,在写出更优雅的代码的同时让浏览器很好的解析. 目的 1.在没有CSS的情况下,页面也能呈现出很好的内容结构和代码结构: 2.有利于SEO:和搜 ...

  10. SICP之1.3中文翻译题目错误

    原版题目: Exercise 1.3: Define a procedure that takes three numbers as arguments and returns the sum of ...