它的做用:能夠經過兩個字段讓表和N張表建立FK關係數據庫
表結構: 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=128, unique=True) course_img = models.CharField(max_length=255, verbose_name="縮略圖") brief = models.TextField(verbose_name="學位課程簡介", ) class Course(models.Model): """專題課程""" name = models.CharField(max_length=128, unique=True) course_img = models.CharField(max_length=255) # 不會在數據庫生成列,只用於幫助你進行查詢 policy_list = GenericRelation("PricePolicy") class PricePolicy(models.Model): """價格與有課程效期表""" content_type = models.ForeignKey(ContentType) # 關聯course or degree_course object_id = models.PositiveIntegerField() #不會在數據庫生成列,只用於幫助你進行添加和查詢 content_object = GenericForeignKey('content_type', 'object_id') valid_period_choices = ( (1, '1天'), (3, '3天'), (7, '1周'), (14, '2周'), (30, '1個月'), (60, '2個月'), (90, '3個月'), (180, '6個月'), (210, '12個月'), (540, '18個月'), (720, '24個月'), ) valid_period = models.SmallIntegerField(choices=valid_period_choices) price = models.FloatField()
使用: # 1.在價格策略表中添加一條數據 ,不用這個方法 # models.PricePolicy.objects.create( # valid_period=7, # price=6.6, # content_type=ContentType.objects.get(model='course'), # object_id=1 # ) # models.PricePolicy.objects.create( # valid_period=14, # price=9.9, # content_object=models.Course.objects.get(id=1) # ) # 2. 根據某個價格策略對象,找到他對應的表和數據,如:管理課程名稱 # price = models.PricePolicy.objects.get(id=2) # print(price.content_object.name) # 自動幫你找到 # 3.找到某個課程關聯的全部價格策略 # obj = models.Course.objects.get(id=1) # for item in obj.policy_list.all(): # print(item.id,item.valid_period,item.price) #
兩個字段讓表和N張表建立FK關係得時候; 利用ContentType,查詢和插入都很方便。django
ContentType spa
自動關聯到這張表3d
GenericForeignKey、GenericRelationcode
插入數據 和 查詢數據 都很方便對象
正向,反向查都很方便,靈活應用!blog