Django 之ContentType
1、介绍
ContentType 解决问题:一个表的两个字段与另外两个(或两个以上)的表有关联
# Course表 免费课 # id name 1 Linux入门 2 Python入门 # DegreeCourse表 学位课 # id name 1 Python全栈 # PricePolicy表 其中的两个字段分别对应上述表的id和表名 # id day price couse_id course_type 1 7 0 1 免费课 2 7 0 2 免费课 3 14 9.9 2 免费课 4 180 18888 1 学位课
修改PricePolicy表,和django的content_type相关联,conten_type保存的书django所有的表名
# PricePolicy表 # id day price couse_id course_type(外键) 1 7 0 1 1 2 14 9.9 1 1 3 180 18888 1 2 # ContentType表 id midel app_lable 1 course app01 2 degreecourse app01
2、自定义方法操作
模型表
from django.db import models class Course(models.Model): name = models.CharField(max_length=32) def __str__(self): return self.name class DegreeCourse(models.Model): name = models.CharField(max_length=32) def __str__(self): return self.name # 使用了ContentType表但是没有用它的方法 from django.contrib.contenttypes.models import ContentType class PricePolicy(models.Model): day = models.IntegerField() price = models.CharField(max_length=8) course_id = models.IntegerField() content_type = models.ForeignKey(to=ContentType, null=True) # 一会要改成外键
# 自定义操作
# 1. 给course中的数据插入一条策略,使用_meta.model_name 来获取表名字符串 # 方法:先查课程;通过课程查得到表名;在策略表中插入数据 course = models.DegreeCourse.objects.first() contenttype = models.ContentType.objects.filter(model=course._meta.model_name).first() models.PricePolicy.objects.create(day=7, price=0, course_id=course.id, content_type=contenttype) # 2. 通过课程查策略, # 方法:同上 course = models.DegreeCourse.objects.first() contenttype = models.ContentType.objects.filter(model=course._meta.model_name).first() price_policy = models.PricePolicy.objects.filter(course_id=course.id, content_type=contenttype).values('day', 'price') print(price_policy) # 通过策略查找课程,使用apps.get_model来获取表的类 # 方法:先查策略表;通过get_model得到表类;然后在课程表内查数据 from django.apps import apps price_policy_obj = models.PricePolicy.objects.filter(day=7, price=0).first() model = apps.get_model('API', price_policy_obj.content_type.model) # 第一个参数是应用名,第二个参数是表名,得到是表的类 course = model.objects.filter(pk=price_policy_obj.course_id) print(course)
3、使用ContentType方法操作
模型表
from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.fields import GenericForeignKey class Course(models.Model): name = models.CharField(max_length=32) price_policy = GenericRelation(to='PricePolicy') def __str__(self): return self.name class DegreeCourse(models.Model): name = models.CharField(max_length=32) price_policy = GenericRelation(to='PricePolicy') def __str__(self): return self.name class PricePolicy(models.Model): day = models.IntegerField() price = models.CharField(max_length=8) object_id = models.IntegerField() content_type = models.ForeignKey(to=ContentType, null=True) model_obj = GenericForeignKey() # 注意: # 1. 这里的model_obj指的就是DegreeCourse 或 Course表对象 # 2. object_id 指的是课程的id,是为了和GenericForeignKey内的参数相对应 # 3. 若要自定义object_id和coutent_type,则GenericForeignKey和GenericRelation内的参数也要修改,如: # course_id = models.IntegerField() # course_type = models.ForeignKey(to=ContentType, null=True) # model_obj = GenericForeignKey(ct_field='course_type', fk_field='course_id') # # price_policy = GenericRelation(to='PricePolicy', object_id_field='course_id', content_type_field='course_type')
# 1. 给course中的数据插入一条策略 degree_course = models.DegreeCourse.objects.first() models.PricePolicy.objects.create(day=180, price=18880, model_obj=degree_course) # 2. 查找所有课程的所有价格策略 price_policy_list = models.PricePolicy.objects.all() for price_policy in price_policy_list: print(price_policy.model_obj.name, price_policy.day, price_policy.price) # 3. 通过课程查策略, course = models.Course.objects.first() price_policys = course.price_policy.all() for price_policy in price_policys: print(course.name, price_policy.day, price_policy.price)

浙公网安备 33010602011771号