【发布时间】:2016-11-14 19:57:34
【问题描述】:
当我尝试为我的 Django 应用程序生成初始迁移时:
python manage.py makemigrations myapp
我得到如下回溯:
File "/myproject/.env/local/lib/python2.7/site-packages/localflavor/us/models.py", line 21, in deconstruct
name, path, args, kwargs = super(USStateField, self).deconstruct()
File "/myproject/.env/local/lib/python2.7/site-packages/localflavor/us/models.py", line 21, in deconstruct
name, path, args, kwargs = super(USStateField, self).deconstruct()
File "/myproject/.env/local/lib/python2.7/site-packages/localflavor/us/models.py", line 21, in deconstruct
name, path, args, kwargs = super(USStateField, self).deconstruct()
File "/myproject/.env/local/lib/python2.7/site-packages/localflavor/us/models.py", line 21, in deconstruct
name, path, args, kwargs = super(USStateField, self).deconstruct()
RuntimeError: maximum recursion depth exceeded while calling a Python object
我正在做的唯一奇怪的事情可能是我试图从 localflavor 包中对 USStateField 进行猴子补丁。具体来说,我需要从字段的状态列表中设置自定义状态选择,所以我正在这样做:
from localflavor.us import models as us_models
_USStateField = us_models.USStateField
class USStateField(_USStateField):
description = _("U.S. state (two uppercase letters)")
def __init__(self, *args, **kwargs):
kwargs['choices'] = MY_STATE_CHOICES
kwargs['max_length'] = 2
super(_USStateField, self).__init__(*args, **kwargs)
us_models.USStateField = USStateField
这在 Django 1.7 中完美运行,但现在在 Django 1.10 中给了我这个错误。有没有更好的方法来做到这一点?
【问题讨论】:
-
为什么不直接在应用中继承所需的模型字段而不用猴子修补呢?有什么让这变得复杂的原因吗?
-
刚刚在
apps.py中测试了猴子补丁 - 它适用于这种特定情况。
标签: python django django-models django-migrations