我有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作为生产数据库。
答案 0 :(得分:0)
查看此处-https://riptutorial.com/django/example/4020/a-basic-unmanaged-table-
该问题可能是由于以下原因引起的:
更新- 现在,请非常小心。
请不要与虚拟这个词混淆。在上面的文章中,该虚拟对象是您的案例客户端中模型的名称。
makemigrations命令(用非正式的词)将模型转换为SQL查询。只要模型中有其他更改,就会创建一个新的迁移文件,存储修改查询。
migrate-此命令实际上在数据库中创建表。检查您的setting.py文件。您必须指定数据库的名称。当您运行此命令时,所有表都将在此数据库中创建。
Django有一种传统的方式将表存储在数据库中。它为每个表命名,其名称以应用程序名称开头,后跟模型的'_'+名称。 例如-假设有一个名为Shop的应用程序,其中的模型中有Client和Store表。运行上述命令后,Django ORM将自动创建名为shop_client和shop_store的表。
使用managed = False时会发生什么? Django不会管理标记为Managed = False的表的任何迁移文件。它将管理尚未标记为“ managed = False”的其他模型的迁移文件。
但是最终,您必须使用常规名称在数据库中使用所有表。因此,您将必须通过SQL查询创建这些表(managed = False),或者使用SQL更好地表述对该表的所有修改。 以前面的例子为例。 Shop应用程序中有两种模型。已为客户端指定了managed = False,但是商店模型保持原样。 Django将仅创建或修改shop_store,而不会触摸shop_client。您将必须通过SQL查询进行所有修改,创建或删除操作。
了解了所有这些,如果您为表指定了managed = False,那么如果您能够自己完成所有这些事情,那将是完全可以的。只需遵循Django所使用的约定并复制该过程,您的东西便会工作。
希望这会有所帮助!