如何在 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',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)?

非常感谢您的帮助,我不知道如何继续

解决方法

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')

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...