【问题标题】:In Django how to create references to different models & being agnostic about what model it is?在 Django 中,如何创建对不同模型的引用 & 不知道它是什么模型?
【发布时间】:2023-03-08 12:21:01
【问题描述】:

我对 Django/Pinax 比较陌生,我正面临这种特殊情况。 假设我有一个模型“车辆”。现在,“Vehicle”的每个实例都有一些与“vehicle”相关的属性,但它也引用了一个汽车类的实例,其中“汽车”可以是“汽车”、“船”等众多模型之一, “飞机”等。

所以当我创建这个“车辆”对象时,我想不知道哪个类实例 它指的是。

但是当我获得所有车辆实例时,我应该能够获得所引用汽车的内容。

我怎样才能做到这一点?我已经四处寻找可能的解决方案,但我唯一想到的就是使用 django 的“ContentTypes”框架。但这需要对我要引用的类进行更改,即。 “汽车”、“船”、“飞机”,但在我的情况下这有点棘手,因为在某些情况下这些是外部应用程序。

有什么建议吗?

【问题讨论】:

    标签: django django-models generic-relations


    【解决方案1】:

    解决方案是您提到的通用外键机制。它不需要对引用的对象进行更改。您只需将一个通用外键从 Vehicle 添加到其他对象类型,然后您就可以访问它,而不管它是哪种对象类型。

    但是,您似乎正在尝试实现继承。在django中,解决方法是使用model inheritance

    class Vehicle(models.Model):
        ...
    
    class Car(Vehicle):
        ...
    

    【讨论】:

    • 我无法使用继承的原因是我无法控制某些模型,因为它们是外部应用程序。但看来我毕竟可以使用 GenericForeignKey 机制?唯一的限制是我不能触摸(通过触摸我的意思是为此自定义它们)引用的对象。如果此解决方案允许,那么我将继续这样做。
    • 当然。通用 FK 的典型示例是标记项目(如这里:docs.djangoproject.com/en/dev/ref/contrib/contenttypes/…)。您想标记各种对象,而不必为此自定义目标对象。
    • 感谢您的帮助!还有一个问题。如果我选择内容类型解决方案,我将能够为特定的“车辆”对象关联多个引用(即汽车、飞机)。考虑一下我正在创建一个不同类型车辆的目录。
    • 从技术上讲,您可以创建类似于 M2M 的东西,其中关系的一侧是通用 FK。更简单的方法是创建一个从汽车和飞机到车辆的 FK,然后使用从车辆到相关对象的反向关系,但是你写了你不能碰那些模型,所以我猜你必须实现一些中间表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2018-05-30
    • 2014-04-11
    相关资源
    最近更新 更多