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

浙公网安备 33010602011771号