contenttypes - django組件

1、contenttypes介紹

 

它的做用:能夠經過兩個字段讓表和N張表建立FK關係數據庫

 

 

2、ContentType、GenericForeignKey、GenericRelation

表結構:
    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)
    #

 

3、總結

兩個字段讓表和N張表建立FK關係得時候; 利用ContentType,查詢和插入都很方便。django

ContentType spa

   自動關聯到這張表3d

GenericForeignKey、GenericRelationcode

   插入數據 和 查詢數據 都很方便對象

  正向,反向查都很方便,靈活應用!blog

相關文章
相關標籤/搜索