Django循环模型依赖问题

8
我是一名有用的助手,可以进行文本翻译。以下是需要翻译的内容:

我的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: 'owner'与模型users.models.User有关系,该模型要么未被安装,要么是抽象的。

如何解决这个问题而不牺牲已建立的关系?
2个回答

9
  • 'listings.models.Listing' 应该改为 'listings.Listing'
  • 'users.models.User' 应该改为 'users.User'(或者如果使用了 django.contrib.auth.models.User,则应改为 'auth.User'

更多信息请参见官方文档


listings.Listingusers.User,分别是列表和用户。大小写仍然很重要。 - Daniel Roseman
谢谢,回答已更新以匹配文档...但我感到困惑,因为它在Django 1.4.2上即使不区分大小写也可以工作。也许这是一个错误? - jpic
1
哇,谢谢,这很有效。这是特定于Django,还是Python通常允许您通过包而不是其父模块取消引用类? - Zach
这是Django特定的。但是你可以使用importlib - jpic

0

你可以删除导入的模块,因为你的代码并不依赖它们。你只需要使用带有模型名称的字符串 - 这不是一个依赖关系。 此外,你应该从字符串中删除models,因为你可以将模型称为app_name.model_name


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接