【问题标题】:How to create several ContentType fields in a Django model?如何在 Django 模型中创建多个 ContentType 字段?
【发布时间】:2021-04-21 11:38:43
【问题描述】:

我的 Django 模型使用 Function 模型,即公司中的通用函数(例如: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)?

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

【问题讨论】:

    标签: django django-models generic-foreign-key contenttype


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-04
      • 2013-07-05
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      相关资源
      最近更新 更多