Django之ContentType

Django之ContentType

 

ContentType是Django提供的一种用来操作数据库的用法,它通过两个字段,可以对不同表进行外键关联,方便表的管理

首先,ContentTpye是Django内部注册的一个app(contettypes)下的models里面的一个类

导入方式:from django.contrib.contenttypes.models import ContentType

使用方式:在需要进行外键关联的表增加一个字段,例如:content_object = GenericForeignKey('content_type','object_id'),这个字段不会在表里面生成,作用是查找数据,其中,'content_type'是外键关联的表,'object_id'是关联表的id

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=32)
    policy_list = GenericRelation("PricePolicy")

class Course(models.Model):
    name = models.CharField(max_length=32)
    policy_list = GenericRelation("PricePolicy")

class PricePolicy(models.Model):
    period = models.CharField(max_length=32)
    price = models.FloatField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.IntegerField()
    content_object = GenericForeignKey('content_type','object_id')
# 为课程添加价格策略
course_obj = models.Course.objects.get(id=1)
                models.PricePolicy.objects.create(period='10', price=9.9, content_object=course_obj)
                models.PricePolicy.objects.create(period='20', price=19.9, content_object=course_obj)
                models.PricePolicy.objects.create(period='30', price=29.9, content_object=course_obj)


# 通过课程查找价格
    obj = models.Course.objects.get(id=1)
    policy_list = models.PricePolicy.objects.all()
    for obj in policy_list:
        print(obj.period,obj.price,obj.content_object,obj.content_object.id,obj.content_object.name)


# 通过课程找价格
    obj = models.Course.objects.get(id=1)
    policy_list = obj.policy_list.all().values_list('period')
    for item in policy_list:
        print(item.price,item.period)

正向查找用GenericForeignKey,反向查找用policy_list

 

posted @ 2018-04-12 20:29  Coufusion  阅读(44)  评论(0)    收藏  举报