如何在django中引用不同的模型

如何在django中引用不同的模型,django,django-models,Django,Django Models,我的应用程序日历如下所示: class Events(models.Model): start_date = models.DateTimeField(null=True,blank=True) end_date = models.DateTimeField(null=True,blank=True) 现在我想要一个日历事件,也要参考其他模型(a、B、C等)。现在您当然可以为每个类创建自己的模型。ForeignKey: class Events(mod

我的应用程序日历如下所示:

class Events(models.Model):        
    start_date = models.DateTimeField(null=True,blank=True)
    end_date = models.DateTimeField(null=True,blank=True)
    
现在我想要一个日历事件,也要参考其他模型(a、B、C等)。现在您当然可以为每个类创建自己的
模型。ForeignKey

class Events(models.Model):        
    start_date = models.DateTimeField(null=True,blank=True)
    end_date = models.DateTimeField(null=True,blank=True)
    a = models.ForeignKey('A', on_delete=models.CASCADE, blank=True, null=True)
    b = models.ForeignKey('B', on_delete=models.CASCADE, blank=True, null=True)
    c = models.ForeignKey('C', on_delete=models.CASCADE, blank=True, null=True)
    ...
但我发现这种方法有点低效,因为模型在每次扩展时都必须一次又一次地进行调整。因此,我会考虑为模型本身创建一个成员,并为模型的各个id创建一个字段

class Events(models.Model):        
    start_date = models.DateTimeField(null=True,blank=True)
    end_date = models.DateTimeField(null=True,blank=True)
    Table_id = ??? (A, B, C, ...)
    Model_id = ??? (a1, a2, b1, c3, ...)
    
如果我想的没错,每个模型在数据库中都有自己的表(或多个表)。其中模型A的表格条目是例如a1、a2、a3。。。因此,为了进行精确的引用,我需要引用相应的表和表条目。你应该怎么做

我已经考虑过一种LUT,但我只是推迟了这个问题。。。django一定有东西准备好了,对吧

肯定有什么把戏吗?或者您会以完全不同的方式解决它,而不是:

将外键从您自己的模型之一添加到ContentType允许 您的模型将自己有效地绑定到另一个模型类,如 上面的权限模型示例。但是有可能去一家 更进一步,使用ContentType启用真正的泛型(有时 称为“多态”)模型之间的关系

例如,它可以在您的模型中使用,如下所示:

from django.contrib.contenttypes.models import ContentType
from django.db import models

class Event(models.Model):
    start_date = models.DateTimeField(null=True, blank=True)
    end_date = models.DateTimeField(null=True, blank=True)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-谢谢@BrianTompsett-汤莱恩 为了给我指出这一点,我编辑了我的答案。