【问题标题】:Django Circular Model DependencyDjango 循环模型依赖
【发布时间】:2012-11-25 18:45:48
【问题描述】:

我的 Django 模型中有一个循环依赖,例如模型 A 具有对 B 的外键引用,而 B 具有对 A 的多对多引用。我查阅了其他 SO 帖子并使用了字符串模型名称而不是实际的类,但无济于事。这是我的两个类的缩写版本:

用户模型

import listings.models

class User(models.Model):
    ...
    favorites = models.ManyToManyField('listings.models.Listing')

上市模式

import users.models

class Listing(models.Model):
    ...
    owner = models.ForeignKey('users.models.User')

每次我尝试运行 syncdb 时,它都会输出以下错误:

错误:一个或多个模型未验证:users.user: 'favorites' 与模型 listings.models.Listing 具有 m2m 关系,该模型具有 要么没有安装,要么是抽象的。 Listings.listing: '所有者' 与模型 users.models.User 有关系,要么没有 已安装或抽象。

如何在不牺牲已建立关系的情况下解决此问题?

【问题讨论】:

    标签: python database django database-design django-models


    【解决方案1】:
    • 'listings.models.Listing' 应该是 'listings.Listing'
    • 'users.models.User' 应该是 'users.User'(或者 'auth.User',如果你要使用 django.contrib.auth.models.User

    更多信息请参考official documentation

    【讨论】:

    • listings.Listingusers.User,分别。案例仍然很重要。
    • 谢谢,答案已更新以匹配文档...但我很困惑,因为它在 Django 1.4.2 上works without the case too。也许这是一个错误?
    • 哇,谢谢,成功了。这是 Django 特有的,还是 Python 通常允许您通过包而不是其父模块来取消引用一个类?
    • 这是 django 特有的。但是你可以使用importlib
    【解决方案2】:

    您可以删除您的导入,因为您不依赖于它们的代码。您只使用带有模型名称的字符串 - 它不是依赖项。 你也应该从你的字符串中删除models - 因为你可以将你的模型称为app_name.model_name

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2015-07-24
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多