- ContentType是Django的内置组件,在执行迁移的时候会自动生成,用于将一个表与多个表进行连接。
- 假设现在有普通课程,和VIP课程,然后我们为这两个课程创建价格策略。
这样,当来了SVIP课程
的时候也可以处理,通过表名称和表ID来确定与之关联的表数据,来个VVVIP我们的时候,表结构也不会发生变化,只要加数据就行了。
-
Django为了我们呢的方便,在创建模型的时候,创建了一个ContentType表。
app_laber1表示模型所属的APP,所有的模型类都在这里,所以我们定义的所有模型类都可以和ContentType做外键,然后就实现了所有表的连接。
-
如何使用呢?
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
class Course(models.Model):
'''普通课程'''
title = models.CharField(max_length=32)
# 不是字段,仅用于反向查找
price_policy = GenericRelation('PricePolicy')
class DegreCourse(models.Model):
'''一般课程'''
title = models.CharField(max_length=32)
# 不是字段,仅用于反向查找
price_policy = GenericRelation('PricePolicy')
class PricePolicy(models.Model):
'''价格策略'''
price = models.IntegerField()
period = models.IntegerField()
content_type = models.ForeignKey(ContentType, verbose_name="表示你关联的是哪个数据表", on_delete='CASCADE')
object_id = models.IntegerField(verbose_name="关联的表中的ID")
# 帮助你快速实现ContenType操作, 不属于字段
content_object = GenericForeignKey('content_type', 'object_id')
# 关联content_type和object_id,
# 添加数据的直接给content_object字段一个对象就可以实现为上面两个字段赋值
简化了很多操作,创建PricePolicy信息的时候,不用去拿content_type和object_id的信息了,直接把关联表的对象赋值给content_object 就可以自动生成了。
查询某个课程的所有价格策略,无需获取 content_type和object_id的值,直接通过该课程的price_policy字段就可以获取。
from .models import PricePolicy,DegreCourse
def test(request,*args,**kwargs):
'''
为学位课Python进阶 添加一个价格策略,30天 9.9元
'''
# 添加一条价格策略
# obj1 = models.DegreCourse.objects.filter(title='Python进阶').first()
# PricePolicy.objects.create(content_object = obj1,period=30,price=30)
course = models.DegreCourse.objects.get(id=1)
course_policy = course.price_policy.all()
print(course_policy)
return HttpResponse('>>>')
- 相当于为两个表创建了两个通道,可以相互查找彼此。
网友评论