【问题标题】:How can I resolve or fix Django cyclic model field dependencies?如何解决或修复 Django 循环模型字段依赖项?
【发布时间】:2020-04-02 16:14:42
【问题描述】:

我有一个数据库设计对应如下伪代码:

class AModel(models.Model):
    c_model_instances = models.OneToOne(CModel, ...)  # "is a" relationship

class BModel(models.Model):
    a_model_instances = models.ManyToMany(AModel, ...)  # "contains" relationship

class CModel(models.Model):
    b_model_instances = models.ManyToMany(BModel, ...)  # "contains" relationship

信不信由你...从业务角度来看,这种设计完全有意义:) 但是,当我尝试迁移数据库时,我当然会收到错误NameError: name 'CModel' is not defined。我该如何解决或修复(通过不同的设计)这个问题?

【问题讨论】:

标签: python django database django-models


【解决方案1】:

您可以使用字符串文字,而不是指向模型的标识符,如the documentation 中所述:

如果您需要在尚未定义的模型上创建关系,您可以使用模型的名称,而不是模型对象本身。

例如:

class AModel(models.Model):
    c_model_instances = models.OneToOne('django_app_name.CModel', …)  # "is a" relationship

class BModel(models.Model):
    a_model_instances = models.ManyToMany(AModel, …)  # "contains" relationship

class CModel(models.Model):
    b_model_instances = models.ManyToMany(BModel, …)  # "contains" relationship

Django 会自动将字符串文字替换为对模型的引用。

【讨论】:

  • 非常感谢。听起来很有希望。我会尽快尝试并接受您的回答。
  • 我现在收到site-packages/django/apps/registry.py", line 140, in check_models_ready raise AppRegistryNotReady("Models aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
  • ForeignKeyunique=True 一起使用而不是OneToOne 会引发同样的错误。
  • 似乎与OneToOne 一起工作。但是`字符串模型引用必须是'app_label.ModelName'的形式。`
  • @thinwybk:如果这些在不同的应用程序中,是的。如果它们在同一个应用程序中,那么您可以删除前缀。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 2016-09-21
  • 2016-08-27
  • 2012-03-09
  • 2020-11-12
相关资源
最近更新 更多