使用情况

一张表需要和多张表进行关联时(只和其中一张表进行关联),如果使用ForeingKey将会有多个null的字段,这种情况可使用ContentTypes

models定义

  1. from django.contrib.contenttypes.fields import GenericForeignKey
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.db import models
  4. class Content(models.Model):
  5. title = models.CharField(verbose_name='标题', max_length=32)
  6. content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
  7. object_id = models.PositiveIntegerField()
  8. content_object = GenericForeignKey('content_type', 'object_id')
  9. class User(models.Model):
  10. name = models.CharField(verbose_name='姓名', max_length=32)
  11. class Vip(models.Model):
  12. name = models.CharField(verbose_name='姓名', max_length=32)

插入数据

  1. user1 = models.User(name='张三')
  2. user1.save()
  3. user2 = models.User(name='李四')
  4. user2.save()
  5. vip1 = models.Vip(name='王五')
  6. vip1.save()
  7. content1 = models.Content(title='第一个', content_object=user1)
  8. content1.save()
  9. content2 = models.Content(title='第二个', content_object=user2)
  10. content2.save()
  11. content3 = models.Content(title='第三个', content_object=vip1)
  12. content3.save()

获取数据

  1. content_list = models.Content.objects.all()
  2. for c in content_list:
  3. print(c.title)
  4. print(type(c.content_object))
  5. print(c.content_object.name)
  6. /*
  7. 第一个
  8. <class 'app01.models.User'>
  9. 张三
  10. 第二个
  11. <class 'app01.models.User'>
  12. 李四
  13. 第三个
  14. <class 'app01.models.Vip'>
  15. 王五
  16. */