首页 > 解决方案 > 如何在 Django 模型中创建多个 ContentType 字段?

问题描述

我的 Django 模型使用函数模型,即公司中的通用函数(例如:CFO)。

在此模型中,我希望有一个字段指向持有该功能的默认人员 + 另一个指向备用人员的字段以防出现问题。该字段中的每一个都应该能够指向各种模型(用户模型+一个尚未在网站上登录的人的模型)

只要我只指向一个模型,这很容易:

class Function(models.Model):
    function_name = models.CharField(max_length=255, blank=True)  # e.g. CFO
    main_user = models.ForeignKey('auth.User', on_delete=models.SET_NULL, null=True, blank=True)
    backup_user = models.ForeignKey('auth.User', on_delete=models.SET_NULL, null=True, blank=True)

但是如果我希望这两个字段中的每一个都指向不同的模型,我需要使用 ContentType,例如:

class Function(models.Model):
    functionname = models.CharField(max_length=255, blank=True)  # e.g. CFO
    
    #GenericForeignKey:
    content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()

如何在一个模型中有两个 GenericForeignKey?(对于 main_user 和 backup_user)?

非常感谢您的帮助,我对如何进行感到困惑

标签: djangodjango-modelsgeneric-foreign-keycontenttype

解决方案


GenericForeginKey可以采用 2 个位置参数,第一个是 到 的字段名称ForeignKeyContentType第二个是通用关系的对象 ID 的字段名称。鉴于这些信息,您可以构建通用关系,例如:

class Function(models.Model):
    functionname = models.CharField(max_length=255, blank=True)  # e.g. CFO

    main_user_content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL)
    main_user_object_id = models.PositiveIntegerField()
    main_user = GenericForeignKey('main_user_content_type', 'main_user_object_id')

    backup_user_content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL)
    backup_user_object_id = models.PositiveIntegerField()
    backup_user = GenericForeignKey('backup_user_content_type', 'backup_user_object_id')

推荐阅读