博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dgango内置组件contenttype
阅读量:5161 次
发布时间:2019-06-13

本文共 2965 字,大约阅读时间需要 9 分钟。

Conttenttypes介绍

当你看到contenttype你是不是想到了请求头的contenttype?

但是

此contenttypes不是请求头Content-Type而是Django自带的app

或许你当时没有注意到contenttypes,这里简单的介绍一下,如何用Django自带的contenttypes

 

业务需求

我们要开设两大门课程,一个是专业课,一个是学位课,

比如专业课有:

  •  21天python入门
  • 网络编程
  • Linux基础

学位课:

  • Python全栈开发
  • Linux运维

每一个课程有不同的周期,不同的周期对应不同的价格.

比如专业课的21天python入门 周期7天10块钱 周期14天15块钱

那么你如何设计的你表结构呢?

 

一张学位课表,一张专业课表示必须的,那么价格表如何设计呢?

使用一张价格表?

如果某天我们需要添加一门面授课,那么你需要在价格表上修改字段吗?增加一个Fk对应面授课?

显然不行

那么每一个课对应一张表?那我有10个课,那岂不是有10个价格表?造成了资源的浪费.

 

那么有什么好的方案?

xid对应着哪一门具体的课程,table_id对应着表的名字,比如第一条table_id对应Course表id为1 21天入门python

下次需要增加课的时候,只需要增加课表,还有在存放表名的表中增加一个id对应的表名就可以解决.

可能你会说这样查询起来很麻烦,NO Django已经帮你做好了.

 

Conttenttypes的应用

加入表简单的表结构

from django.db import modelsfrom django.contrib.contenttypes.models import ContentTypefrom django.contrib.contenttypes.fields import GenericForeignKey, GenericRelationclass DegreeCourse(models.Model):    """学位课程"""    name = models.CharField(max_length=128, unique=True)    course_img = models.CharField(max_length=255, verbose_name="缩略图")    brief = models.TextField(verbose_name="学位课程简介", )class Course(models.Model):    """专题课程"""    name = models.CharField(max_length=128, unique=True)    course_img = models.CharField(max_length=255)    # 不会在数据库生成列,只用于帮助你进行查询    policy_list = GenericRelation("PricePolicy")class PricePolicy(models.Model):    """价格与有课程效期表"""    content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE)  # 关联course or degree_course    object_id = models.PositiveIntegerField()    #不会在数据库生成列,只用于帮助你进行添加和查询    content_object = GenericForeignKey('content_type', 'object_id')    valid_period_choices = (        (1, '1天'),        (3, '3天'),        (7, '1周'), (14, '2周'),        (30, '1个月'),        (60, '2个月'),        (90, '3个月'),        (180, '6个月'), (210, '12个月'),        (540, '18个月'), (720, '24个月'),    )    valid_period = models.SmallIntegerField(choices=valid_period_choices)    price = models.FloatField()
content_object = GenericForeignKey('content_type', 'object_id')里面的字段名必须是content_type,object_id 因为GenericForeignKey类的源码里已经写清楚了

 

创建字段

那么我们如何添加一个价格字段?

models.PricePolicy.objects.create(        valid_period=14,        price=9.9,
content_object=models.Course.objects.get(id=1) )

 content_object 字段对应的必须是一个对象,是你想要关联的object_id的对象.只要对应了一个对象他就会自动的帮你添加

content_type 对应的存放表id
object_id 对应了课表的id 在你创建表的时候,Djnaog会自动帮你创建第三张表,就是id对应表名

 

查询

# 2. 根据某个价格策略对象,找到他对应的表和数据,如:关联课程名称    price = models.PricePolicy.objects.get(id=2)    print(price.content_object.name)     # 自动帮你找到对应课程的对象

 

如果要课程查询所有价格需要在课程表上添加一个字段

# 不会在数据库生成列,只用于帮助你进行查询    policy_list = GenericRelation("PricePolicy") 根据这个字段名可以跨表查询
# 3.找到某个课程关联的所有价格策略    obj = models.Course.objects.get(id=1)    for item in obj.policy_list.all():        print(item.id,item.valid_period,item.price)

 什么时候要用contenttypes?

  • 某一张表需要对应多个Fk字段的时候 且Fk所对应的表是同一种类型
  • 且一旦增加业务的时候,需要在该表增加FK字段

 1. django contenttypes组件的作用?

    - 数据库迁移时,找到所有app中的表并录入到django_content_type表

     - 内置两个字段: GenericRelation GenericForeignKey

 

转载于:https://www.cnblogs.com/weidaijie/p/10425574.html

你可能感兴趣的文章
2019年春季第九周 编程总结
查看>>
Discuz!NT静态文件缓存(SQUID)
查看>>
andorid ListView和GirdView 与ScrollView 冲突
查看>>
WP8.1和Win8.1的不同之处
查看>>
回文串编辑
查看>>
观察者模式
查看>>
软件开发中的哲学——世界的本原是物质(一)
查看>>
Android(常用)主流UI开源库整理
查看>>
python 单例模式
查看>>
C++的访问关系
查看>>
始终使用属性(Property),而不是字段(Data Member)
查看>>
Python核心编程读笔 7: 条件和循环
查看>>
META http-equiv简介
查看>>
Linux下添加新硬盘,分区及挂载
查看>>
java.lang.OutOfMemoryError处理错误
查看>>
Spring Bean的ref属性和IoC注入集合
查看>>
【剑指offer】Java版代码(完整版)
查看>>
赛博杯-HMI流水灯-stack
查看>>
20172301 《Java软件结构与数据结构》实验一报告
查看>>
C# GMap下提供一个高德地图
查看>>