两个 Django 项目之间的共享模型以及仅存在于其中一个项目中的模型的外键

Xil*_*xio 3 django django-models

我有两个相互通信的 Django 项目。第一个包含 modelA并且B有一个ForeignKeyto A。第一个项目发送和接收B来自第二个项目的序列化对象。我希望第二个项目只包含该内容B,但它需要该内容的价值ForeignKey。这些模型定义如下:

class A(models.Model):
    ...

class B(models.Model):
    fk = models.ForeignKey(to='A', on_delete=models.PROTECT)
    ...
Run Code Online (Sandbox Code Playgroud)

问题是ForeignKey模型需要在第二个项目A中定义B模型。A它的对象也必须存在,以便数据库一致并且不存在问题,例如在管理面板中。

最后,我想在第一个项目中将该fk字段视为成熟的字段ForeignKey,在第二个项目中将该字段视为某种只读通用标识符。具体来说,我需要保留第一个项目中双向查询的功能,例如fk__some_a_fieldb_set。我希望两个项目中的模型具有相同的代码库,以确保两个项目中的数据库保持同步。我怎样才能以干净的方式实现这一目标?

编辑:我也在考虑fk = CustomField(...)哪个或多或少被定义为

if IS_FIRST_PROJECT:
    CustomField = ForeignKey
else:
    CustomField = IntegerField
Run Code Online (Sandbox Code Playgroud)

但问题是我需要一种干净的方法来选择与默认外键完全匹配的整数字段类型。另外,我不确定这样的解决方案是否会带来意想不到的问题。

V.D*_*.D. 5

具体来说,我需要保留第一个项目中双向查询的功能,例如fk__some_a_field和b_set。

如果您想使用 django orm,则必须在项目 2 中从项目 1 重新创建 A 模型。但由于模型 A 由项目 1 管理,请考虑将下一行添加到项目 2 中的模型中:

class A(models.Model):
    ...
    
    class Meta:
        managed = False
        db_table = 'your database table name where A model is stored'

Run Code Online (Sandbox Code Playgroud)

managed=False会告诉 django 忽略它的迁移,并且不允许 django 更改该模型的数据库表。

如果您不想将模型从项目 1 复制到项目 2,另一个解决方案是不使用 django orm。并且自己写sql查询。但正如你提到的你不想这样做

P.S如果你不知道如何查看模型 A 的数据库表名称,你可以像这样输出:a_model_instance._meta.db_table,或者如果你使用的是 postgres,可以在 pgadmining 等工具中查看它