Django的ContenType组件

2019-09-28  本文已影响0人  上帝大人

这样,当来了SVIP课程的时候也可以处理,通过表名称和表ID来确定与之关联的表数据,来个VVVIP我们的时候,表结构也不会发生变化,只要加数据就行了。
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('>>>')
上一篇 下一篇

猜你喜欢

热点阅读