Dmi*_*lov 24 python django unit-testing django-models django-migrations
当我运行测试时,我在数据库初始化期间遇到此错误:
django.db.migrations.state.InvalidBasesError: Cannot resolve bases for [<ModelState: 'users.GroupProxy'>]
This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth)
Run Code Online (Sandbox Code Playgroud)
我为contrib.auth Group模型创建了这个代理,将它放在django admin的应用程序中:
class GroupProxy(Group):
class Meta:
proxy = True
verbose_name = Group._meta.verbose_name
verbose_name_plural = Group._meta.verbose_name_plural
Run Code Online (Sandbox Code Playgroud)
那么我该怎么做才能解决这个问题呢?
dls*_*sso 23
经过大量挖掘后,唯一对我有用的是
comment out the offending apps, run migrations, then add them in again.
只是一个解决方法,但希望它有助于某人.
aug*_*men 18
我已经遇到过这个问题,并且由于评论模型并不是真正的解决方案,我发现将未记录的设置auto_created = True为Meta类将使Django忽略它.
class GroupProxy(Group):
class Meta:
proxy = True
auto_created = True
Run Code Online (Sandbox Code Playgroud)
tin*_*ino 14
只需migrations在应用程序的根目录创建一个目录(users/migrations/在您的情况下),并添加一个空__init__.py文件可能会解决您的问题.当我遇到同样的错误时,至少它对我有用.
但makemigrations正如上面的@zenofewords所建议的,你最好为你的应用程序运行.这将为您创建目录并为您的代理模型生成迁移.
您的测试正在寻找那些迁移并且没有找到它们.
manage.py makemigrations <app_label>在运行测试之前,您是否尝试在应用上运行?
此外,检查应用程序您尝试代理的型号是否包含在INSTALLED_APPS中.
我也遇到了这个问题(在做了一些复杂的模型继承之后)。我的一次迁移包含
migrations.CreateModel(
name='Offer',
fields=[
# ...
],
options={
# ...
},
bases=('shop.entity',),
),
Run Code Online (Sandbox Code Playgroud)
我shop.Entity完全删除了模型,但迁移在bases属性中引用了它。所以我只是删除了bases=('shop.entity',)它就可以了。它可能会从一开始就失去迁移的机会,但至少允许进一步迁移。
另一个建议是:直接转到 django 代码并检查导致“基础”问题的原因。转到django/db/migrations/state.py并添加断点:
try:
bases = tuple(
(apps.get_model(base) if isinstance(base, six.string_types) else base)
for base in self.bases
)
except LookupError:
print(self.bases) # <-- print the bases
import ipdb; ipdb.set_trace() # <-- debug here
raise InvalidBasesError("Cannot resolve one or more bases from %r" % (self.bases,))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11043 次 |
| 最近记录: |