Django在删除时无休止地循环



也许以下是django错误:

我有三个模型,而其中一个有自定义的__init__方法:

from django.db import models

class Foo(models.Model):
my_foo = models.CharField(max_length=1000)

class Bar(models.Model):
bar1 = models.CharField(max_length=1000, default="")
bar2 = models.BooleanField(default=False)
foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
def __init__(self, *args, **kwargs):
super(Bar, self).__init__(*args, **kwargs)
print("check")
self._original_bar1 = self.bar1
self._original_bar2 = self.bar2

class Baz(models.Model):
bar = models.ForeignKey(Bar, on_delete=models.CASCADE)

创建一个Foo对象和一个相应的Bar对象(通过管理界面(可以很好地工作。然而,当我删除Foo对象时,这会导致__init__方法的无休止循环。

如果我将模型稍微改写为

from django.db import models

class Foo(models.Model):
my_foo = models.CharField(max_length=1000)

class AbstractBar2(models.Model):
bar2 = models.BooleanField(default=False)
def __init__(self, *args, **kwargs):
super(AbstractBar2, self).__init__(*args, **kwargs)
print("check")
self._original_bar2 = self.bar2
class Meta:
abstract = True

class AbstractBar1(models.Model):
bar1 = models.CharField(max_length=1000, default="")
def __init__(self, *args, **kwargs):
super(AbstractBar1, self).__init__(*args, **kwargs)
print("check")
self._original_bar1 = self.bar1
class Meta:
abstract = True

class Bar(AbstractBar1, AbstractBar2):
foo = models.ForeignKey(Foo, on_delete=models.CASCADE)

class Baz(models.Model):
bar = models.ForeignKey(Bar, on_delete=models.CASCADE)

它在上出错

Fatal Python error: _Py_CheckRecursiveCall: Cannot recover from stack overflow.
Python runtime state: initialized
Current thread 0x000035d0 (most recent call first):
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsfields__init__.py", line 807 in get_prep_value
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsfields__init__.py", line 1770 in get_prep_value
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelslookups.py", line 76 in get_prep_lookup
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelslookups.py", line 24 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelssqlquery.py", line 1165 in build_lookup
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelssqlquery.py", line 1319 in build_filter
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelssqlquery.py", line 1377 in _add_q
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelssqlquery.py", line 1358 in add_q
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 969 in _filter_or_exclude_inplace
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 962 in _filter_or_exclude
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 942 in filter
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsmanager.py", line 85 in manager_method
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 623 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 26 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 14 in __init__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 24 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 26 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 14 in __init__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 24 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 26 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 14 in __init__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 24 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 26 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 14 in __init__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 24 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 26 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 14 in __init__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 24 in __init__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 513 in from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 71 in __iter__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 1308 in _fetch_all
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 269 in __len__
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery.py", line 425 in get
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsbase.py", line 635 in refresh_from_db
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangodbmodelsquery_utils.py", line 149 in __get__
File "C:UsersnamePycharmProjectsdjangoTestfoobarmodels.py", line 26 in __init__
...
Thread 0x00000a60 (most recent call first):
File "C:UsersnameAppDataLocalProgramsPythonPython39libselectors.py", line 315 in _select
File "C:UsersnameAppDataLocalProgramsPythonPython39libselectors.py", line 324 in select
File "C:UsersnameAppDataLocalProgramsPythonPython39libsocketserver.py", line 232 in serve_forever
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoreserversbasehttp.py", line 216 in run
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoremanagementcommandsrunserver.py", line 139 in inner_run
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangoutilsautoreload.py", line 53 in wrapper
File "C:UsersnameAppDataLocalProgramsPythonPython39libthreading.py", line 888 in run
File "C:UsersnameAppDataLocalProgramsPythonPython39libthreading.py", line 950 in _bootstrap_inner
File "C:UsersnameAppDataLocalProgramsPythonPython39libthreading.py", line 908 in _bootstrap
Thread 0x00000c7c (most recent call first):
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangoutilsautoreload.py", line 374 in tick
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangoutilsautoreload.py", line 324 in run_loop
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangoutilsautoreload.py", line 318 in run
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangoutilsautoreload.py", line 603 in start_django
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangoutilsautoreload.py", line 618 in run_with_reloader
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoremanagementcommandsrunserver.py", line 103 in run
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoremanagementcommandsrunserver.py", line 96 in handle
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoremanagementbase.py", line 371 in execute
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoremanagementcommandsrunserver.py", line 61 in execute
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoremanagementbase.py", line 330 in run_from_argv
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoremanagement__init__.py", line 395 in execute
File "C:UsersnamePycharmProjectsglobal39djangoTestlibsite-packagesdjangocoremanagement__init__.py", line 401 in execute_from_command_line
File "C:UsersnamePycharmProjectsdjangoTestmanage.py", line 18 in main
File "C:UsersnamePycharmProjectsdjangoTestmanage.py", line 22 in <module>
Process finished with exit code -1

有什么想法吗?

这种行为已经向Django Issues跟踪器报告了几次(#31435、#31475、#32660(。

建议使用Model.from_db()进行自定义模型加载,此外还有一些可用的文档。如果这是不可能的,则提到使用self.__dict__.get('attribute')作为在override__init__方法中调用的替代方法。

在处理中建议的多个属性时,这一点尤其重要https://stackoverflow.com/a/1793323/2159075

最新更新