【问题标题】:Recursion Error - Maximum Recursion dept exceeded when ForeignKey('self') django递归错误-当 ForeignKey('self') django 超出最大递归深度
【发布时间】:2018-03-04 04:32:39
【问题描述】:

我在尝试打开模型时在管理控制台中遇到错误(在我的例子中是员工)。这是在添加一个 ForeignKey('self') 字段之后发生的。我猜它与 str 方法冲突。如果我注释掉该方法,则没有错误,但模型中的所有对象都显示为“员工对象”。这是我的错误的样子https://ibb.co/jHt84Q

这是我的models.py:

from django.db import models
import calendar  
from datetime import datetime
from datetime import timedelta

class employees(models.Model):
    emp_id=models.PositiveIntegerField()
    emp_name = models.CharField(max_length = 100)
    emp_lname = models.CharField(max_length = 100)
    emp_loc = models.CharField(max_length = 100,null=True)
    manager_id=models.ForeignKey('self',null=True,blank=True)
    image=models.ImageField(upload_to='profile_image',default='/profile_image/profile-icon.png')
    email = models.EmailField(default='app-engine@gmail.com', blank=False)
    def __str__(self):
        return str(self.emp_id) + '-' + self.emp_name + '-' + self.emp_loc+'-'+str(self.manager_id)


class leave(models.Model): 

    employee = models.ForeignKey(employees, on_delete=models.CASCADE, default='1')
    start_date = models.DateField()
    end_date = models.DateField()
    status=models.CharField(max_length=1,default='P')
    ltype=models.CharField(max_length=2)
    message=models.CharField(max_length=500,blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    def leave_length(self):
          return self.end_date - self.start_date+timedelta(days=1);

    def __str__(self):
        return str(self.id) + '/' + str(self.employee.emp_name) +'/'+str(self.start_date) +'/'+str(self.end_date) +'/'+str(self.status)+'/'+str(self.date_created)

这是我的回溯:

Environment:


Request Method: GET
Request URL: http://localhost:8000/admin/apply/employees/

Django Version: 1.11.3
Python Version: 3.6.0
Installed Applications:
['apply.apps.ApplyConfig',
 'm_manage',
 'pending.apps.PendingConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\contrib\admin\templates\admin\base.html, error at line 75
   maximum recursion depth exceeded while calling a Python object   65 :           <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message|capfirst }}</li>
   66 :         {% endfor %}</ul>
   67 :         {% endif %}
   68 :     {% endblock messages %}
   69 : 
   70 :     <!-- Content -->
   71 :     <div id="content" class="{% block coltype %}colM{% endblock %}">
   72 :         {% block pretitle %}{% endblock %}
   73 :         {% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %}
   74 :         {% block content %}
   75 :          {% block object -tools %}{% endblock %}
   76 :         {{ content }}
   77 :         {% endblock %}
   78 :         {% block sidebar %}{% endblock %}
   79 :         <br class="clear" />
   80 :     </div>
   81 :     <!-- END Content -->
   82 : 
   83 :     {% block footer %}<div id="footer"></div>{% endblock %}
   84 : </div>
   85 : <!-- END Container -->


Traceback:

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\db\models\options.py" in get_field
  617.             return self.fields_map[field_name]

During handling of the above exception ('__str__'), another exception occurred:

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\contrib\admin\utils.py" in lookup_field
  283.         f = _get_non_gfk_field(opts, name)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\contrib\admin\utils.py" in _get_non_gfk_field
  317.     field = opts.get_field(name)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\db\models\options.py" in get_field
  619.             raise FieldDoesNotExist("%s has no field named '%s'" % (self.object_name, field_name))

During handling of the above exception (employees has no field named '__str__'), another exception occurred:

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\db\models\fields\related_descriptors.py" in __get__
  178.             rel_obj = getattr(instance, self.cache_name)

During handling of the above exception ('employees' object has no attribute '_manager_id_cache'), another exception occurred:

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\core\handlers\exception.py" in inner
  41.             response = get_response(request)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\core\handlers\base.py" in _get_response
  217.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\core\handlers\base.py" in _get_response
  215.                 response = response.render()

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\response.py" in render
  107.             self.content = self.rendered_content

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\response.py" in rendered_content
  84.         content = template.render(context, self._request)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\backends\django.py" in render
  66.             return self.template.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render
  207.                     return self._render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in _render
  199.         return self.nodelist.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render
  990.                 bit = node.render_annotated(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render_annotated
  957.             return self.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in _render
  199.         return self.nodelist.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render
  990.                 bit = node.render_annotated(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render_annotated
  957.             return self.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in _render
  199.         return self.nodelist.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render
  990.                 bit = node.render_annotated(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render_annotated
  957.             return self.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\loader_tags.py" in render
  72.                 result = block.nodelist.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render
  990.                 bit = node.render_annotated(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render_annotated
  957.             return self.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\loader_tags.py" in render
  72.                 result = block.nodelist.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render
  990.                 bit = node.render_annotated(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\base.py" in render_annotated
  957.             return self.render(context)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\template\library.py" in render
  225.         _dict = self.func(*resolved_args, **resolved_kwargs)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\contrib\admin\templatetags\admin_list.py" in result_list
  340.             'results': list(results(cl))}

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\contrib\admin\templatetags\admin_list.py" in results
  316.             yield ResultList(None, items_for_result(cl, res, None))

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\contrib\admin\templatetags\admin_list.py" in __init__
  307.         super(ResultList, self).__init__(*items)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\contrib\admin\templatetags\admin_list.py" in items_for_result
  218.             f, attr, value = lookup_field(field_name, result, cl.model_admin)

File "C:\Users\rhshanka\AppData\Local\Programs\Python\Python36\lib\site-packages\django-1.11.3-py3.6.egg\django\contrib\admin\utils.py" in lookup_field
  299.                 value = attr()

File "C:\Users\rhshanka\LMS\apply\models.py" in __str__
  15.         return str(self.emp_id) + '-' + self.emp_name + '-' + self.emp_loc+'-'+str(self.manager_id)


Exception Type: RecursionError at /admin/apply/employees/
Exception Value: maximum recursion depth exceeded while calling a Python object

【问题讨论】:

  • 您的一名员工可能自称是经理。
  • 我检查了我的数据,但似乎没有出现这种情况。我有 10 名员工,其中一名是经理,其 manager_id = None
  • 那么你需要展示更多细节。单击错误页面上显示“切换到复制和粘贴视图”的链接,并使用结果文本更新问题。
  • 您是想显示经理 id(int 值)还是实际上试图将经理的字符串表示形式放入方法中?
  • 您将错误图像上传到的那个网站不允许在移动设备上进行缩放,否则无法辨认。所有与问题相关的信息都应直接在此处发布,并尽可能以文本形式发布。堆栈跟踪是什么?这应该告诉你你需要知道的一切。

标签: python django django-models foreign-keys


【解决方案1】:

试试看:

def __str__(self):
    self_str = '%s-%s-%s' % (self.emp_id, self.emp_name, self.emp_loc)
    if self.manager_id and self.manager_id.pk != self.pk:
        return '%s-%s' % (self_str, str(self.manager_id))
    return self_str

而且你需要确保你的逻辑是正确的,因为许多继承它是不可读的。

【讨论】:

  • 很高兴为您提供帮助,此解决方案与 Daniel Roseman 对您说的相同
  • 是的,后来我意识到了。最初,我将所有员工的经理设置为其他对象,但后来,当我注释掉 str 方法时,每个员工的经理都成为我表的第一个对象。我无法识别,因为没有显示数据,只显示了“员工对象”。
猜你喜欢
  • 2016-12-10
  • 2018-12-03
  • 2019-07-03
  • 2017-08-09
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2013-02-20
相关资源
最近更新 更多