2017-09-22 5 views
1

Je reçois une erreur dans la console d'administration lorsque j'essaie d'ouvrir un modèle (employés dans mon cas). Cela se produit après l'ajout d'un champ qui est un ForeignKey ('self'). Je suppose qu'il est en conflit avec str méthode. Si je commente la méthode, il n'y a pas d'erreur, mais tous les objets du modèle apparaissent comme 'objet employé'. Voici ce que mon erreur ressemble https://ibb.co/jHt84QErreur de récursivité - Dépassement du rayon maximal de la récursivité lorsque ForeignKey ('self') django

Voici mon 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='[email protected]', 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) 

Voici mon retraçage:

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 
+0

Un de vos employés a probablement lui-même en tant que gestionnaire. –

+0

J'ai vérifié mes données et ce cas ne semble pas apparaître. J'ai 10 employés et l'un d'eux est un gestionnaire dont manager_id = Aucun –

+0

Ensuite, vous devrez montrer plus de détails. Cliquez sur le lien sur la page d'erreur qui dit "Passer à copier-coller" et mettre à jour la question avec le texte qui en résulte. –

Répondre

0

Essayez:

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 

Et vous Vous devez être sûr que votre logique est correcte, car pour beaucoup d'héritiers, elle ne sera pas lisible.

+0

Hey! Merci beaucoup! Ca t'a aidé :) –

+0

content de t'aider, cette solution est la même que te l'a dit le Daniel Roseman –

+0

Ouais, je l'ai réalisé plus tard. Initialement, j'ai défini le gestionnaire pour tous les employés comme un autre objet, mais plus tard, quand j'ai commenté la méthode __str__, le manager de chaque employé est devenu le premier objet de ma table. Je ne pouvais pas reconnaître que puisque les données ne sont pas affichées, seul 'l'objet employé' était affiché. –