美文网首页
Django的ContenType组件

Django的ContenType组件

作者: 上帝大人 | 来源:发表于2019-09-28 20:15 被阅读0次
    • 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('>>>')
    
    • 相当于为两个表创建了两个通道,可以相互查找彼此。

    相关文章

      网友评论

          本文标题:Django的ContenType组件

          本文链接:https://www.haomeiwen.com/subject/njinuctx.html