如何在Django中将ForeignKey添加到非托管模型?

时间:2020-09-03 18:27:30

标签: django django-models

我有2个模型,如下所示:

class Client(models.Model):
    name = models.CharField(max_length=50)

    class Meta:
        managed=False


class Store(models.Model):
    name = models.CharField(max_length=50)
    match = models.ForeignKey('Client', on_delete=models.CASCADE)

运行迁移时,出现以下错误。

django.db.utils.ProgrammingError: relation "client" does not exist

我该如何解决?我正在使用django 3.1和Postgres 12作为生产数据库。

1 个答案:

答案 0 :(得分:0)

查看此处-https://riptutorial.com/django/example/4020/a-basic-unmanaged-table-

该问题可能是由于以下原因引起的:

  1. 通过Managed = False,Django将无法管理模式。它不会对此进行任何迁移。但是您必须具有可以使用SQL查询创建的表。
  2. 第二个也是最重要的一点,您使用SQL创建的表必须命名为myapp_client,其中“ myapp”是此模式所在的应用程序的名称。

更新- 现在,请非常小心。

  1. 请不要与虚拟这个词混淆。在上面的文章中,该虚拟对象是您的案例客户端中模型的名称。

  2. makemigrations命令(用非正式的词)将模型转换为SQL查询。只要模型中有其他更改,就会创建一个新的迁移文件,存储修改查询。

  3. migrate-此命令实际上在数据库中创建表。检查您的setting.py文件。您必须指定数据库的名称。当您运行此命令时,所有表都将在此数据库中创建。

  4. Django有一种传统的方式将表存储在数据库中。它为每个表命名,其名称以应用程序名称开头,后跟模型的'_'+名称。 例如-假设有一个名为Shop的应用程序,其中的模型中有Client和Store表。运行上述命令后,Django ORM将自动创建名为shop_client和shop_store的表。

  5. 使用managed = False时会发生什么? Django不会管理标记为Managed = False的表的任何迁移文件。它将管理尚未标记为“ managed = False”的其他模型的迁移文件。

  6. 但是最终,您必须使用常规名称在数据库中使用所有表。因此,您将必须通过SQL查询创建这些表(managed = False),或者使用SQL更好地表述对该表的所有修改。 以前面的例子为例。 Shop应用程序中有两种模型。已为客户端指定了managed = False,但是商店模型保持原样。 Django将仅创建或修改shop_store,而不会触摸shop_client。您将必须通过SQL查询进行所有修改,创建或删除操作。

了解了所有这些,如果您为表指定了managed = False,那么如果您能够自己完成所有这些事情,那将是完全可以的。只需遵循Django所使用的约定并复制该过程,您的东西便会工作。

希望这会有所帮助!

相关问题