11.8Django中的组件content_type
阅读原文时间:2024年05月29日阅读:2

2018-11-8 18:59:11

在Django中已经有一个contenttype这个组件,并且在python manage.py makemigrations 和migrate的时候,一起在数据库创建了表

这个表里面默认存着id和表名字

当有如下需求,就是一张表需要对多张表的时候,就需要 contenttype这个组件啦

上代码演示:

models.py

from django.db import models
from django.contrib.contenttypes.models import ContentType

from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation

class 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) # 关联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()

如何使用

views.py代码

price = models.PricePolicy.objects.get(id=2)
print(price.content_object.name) # 自动帮你找到该课程名字

obj.policy_list.all()拿到的是queryset对象

from django.shortcuts import render,HttpResponse
from app01 import models
from django.contrib.contenttypes.models import ContentType

def test(request):
# 1.在价格策略表中添加一条数据
# models.PricePolicy.objects.create(
# valid_period=7,
# price=6.6,
# content_type=ContentType.objects.get(model='course'),
# object_id=1
# )

# models.PricePolicy.objects.create(  
#     valid\_period=14,  
#     price=9.9,  
#     content\_object=models.Course.objects.get(id=1)  
# )

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

# 3.找到某个课程关联的所有价格策略  
# obj = models.Course.objects.get(id=1)  
# for item in obj.policy\_list.all():  
#     print(item.id,item.valid\_period,item.price)  
#  
return HttpResponse('...')

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章