FieldError: no se puede resolver la palabra clave ‘XXXX’ en el campo

Este es un error muy extraño. Solo lo recibo en mi servidor heroku.

Así es como mi modelo es:

# Abstract Model class CommonInfo(models.Model): active = models.BooleanField('Enabled?', default=False) date_created = models.DateTimeField(auto_now_add=True) date_updated = models.DateTimeField(auto_now=True) class Meta: abstract = True class Country(CommonInfo): name = models.CharField('Country Name', db_index=True, max_length=200, help_text='eg France') official_name = models.CharField('Official Name', max_length=400, blank=True, help_text='eg French Republic') population = models.IntegerField('Population', help_text='Population must be entered as numbers with no commas or separators, eg 39456123', null=True, blank=True) alpha2 = models.CharField('ISO ALPHA-2 Code', max_length=2, blank=True) class News(CommonInfo): title = models.CharField('Title', max_length=250) slug = models.CharField('slug', max_length=255, unique=True) body = models.TextField('Body', null=True, blank=True) excerpt = models.TextField('Excerpt', null=True, blank=True) author = models.ForeignKey(Author) country = models.ManyToManyField(Country, null=True, blank=True) def __unicode__(self): return self.title 

Cuando bash acceder a las noticias desde el sitio de administración en mi servidor de producción, recibo este error (todo funciona bien en mi servidor de desarrollo):

 FieldError: Cannot resolve keyword 'news' into field. Choices are: active, alpha2, date_created, date_updated, id, name, official_name, population File "/app/.heroku/python/lib/python2.7/site-packages/django/db/models/query.py", line 687, in _filter_or_exclude clone.query.add_q(Q(*args, **kwargs)) File "/app/.heroku/python/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1271, in add_q can_reuse=used_aliases, force_having=force_having) File "/app/.heroku/python/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1139, in add_filter process_extras=process_extras) File "/app/.heroku/python/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1337, in setup_joins "Choices are: %s" % (name, ", ".join(names))) 

Ejecuto las mismas versiones de django (1.5.4) y python (2.7.2) en mis entornos de producción y desarrollo.

Mi servidor de producción es Heroku.

¿Alguna idea de qué podría desencadenar el error?

ACTUALIZACIÓN :

admin.py config es como sigue:

 from django.contrib import admin from APP.models import Country, News class NewsForm(ModelForm): class Meta: model = News class NewsAdmin(ModelAdmin): form = NewsForm search_fields = ['title', 'country__name'] list_filter = ('country', 'active' ) list_per_page = 30 list_editable = ('active', ) list_display = ('title', 'active' ) list_select_related = True prepopulated_fields = {"slug": ("title",)} admin.site.register(Country) admin.site.register(News, NewsAdmin) 

Finalmente, pude resolver el problema.

Primero, logré replicar el error en mi entorno local. Al principio, estaba probando la aplicación utilizando Django runserver integrado. Sin embargo, mi entorno de producción es Heroku, que utiliza Gunicorn como servidor web. Cuando cambié a Gunicorn y a foreman en mi servidor local, pude replicar el error.

En segundo lugar, traté de identificar el problema siguiendo los modelos y agregando / eliminando diferentes componentes y campos. Para explicar mejor el proceso, debo agregar una pieza faltante a la pregunta original.

La descripción que había publicado arriba es un poco incompleta. Tengo otro modelo en my models.py que no incluí en mi pregunta original, porque pensé que no era relevante. Aquí está el modelo completo:

 # Abstract Model class CommonInfo(models.Model): active = models.BooleanField('Enabled?', default=False) date_created = models.DateTimeField(auto_now_add=True) date_updated = models.DateTimeField(auto_now=True) class Meta: abstract = True class Country(CommonInfo): name = models.CharField('Country Name', db_index=True, max_length=200, help_text='eg France') official_name = models.CharField('Official Name', max_length=400, blank=True, help_text='eg French Republic') population = models.IntegerField('Population', help_text='Population must be entered as numbers with no commas or separators, eg 39456123', null=True, blank=True) alpha2 = models.CharField('ISO ALPHA-2 Code', max_length=2, blank=True) def get_country_names(): names = Country.objects.only('name').filter(active=1) names = [(str(item), item) for item in names] return names class Person(CommonInfo): name = models.CharField(max_length=200) lastname = models.CharField(max_length=300) country = models.CharField(max_length=250, choices=choices=get_country_names()) class News(CommonInfo): title = models.CharField('Title', max_length=250) slug = models.CharField('slug', max_length=255, unique=True) body = models.TextField('Body', null=True, blank=True) excerpt = models.TextField('Excerpt', null=True, blank=True) author = models.ForeignKey(Author) country = models.ManyToManyField(Country, null=True, blank=True) def __unicode__(self): return self.title 

El diseño de mi modelo no requería una tabla ForeignKey for Person, así que decidí ir con un simple CharField y, en su lugar, usar un menú desplegable regular. Sin embargo, por alguna razón, Gunicorn genera el error mencionado anteriormente cuando, como parte de get_country_names (), la tabla de País se llama antes que Noticias. Tan pronto como eliminé los get_country_names () y convertí el campo country en la tabla Person en un CharField regular, el problema se resolvió.

Leer los comentarios en este viejo error de Django y este post de Chase Seibert me ayudó considerablemente en este proceso.

Aunque el boleto # 1796 parece haberse reparado hace más de 6 años, parece que algunos pequeños problemas aún permanecen profundamente enterrados allí.

¡Eso es! Gracias a todos.

Añadiendo a las posibles situaciones en las que esto sucede. Busqué el campo que no se pudo encontrar en ninguno de mis modelos.

__in buscar en el código, descubrí que estaba anotando un queryset en dicho campo y luego enviaba ese queryset como una búsqueda __in a otro (junto con otras consultas complejas).

Mi trabajo fue cambiar ese queryset anotado para devolver identificaciones y usar eso. En este caso particular, ese resultado siempre será pequeño, por lo que la lista de ID no fue un problema para aprobar.

Tuve algunas relaciones ManyToMany que trabajaban en una sola dirección. Había estado jugando con mi configuración y cambiando el nombre de la aplicación principal un par de veces. ¡En algún lugar a lo largo de las líneas, lo había eliminado de la sección INSTALLED_APPS ! Una vez que agregué eso de nuevo, entonces funcionó. Definitivamente PEBKAC, pero tal vez esto ayude a alguien algún día. Me tomó un tiempo pensar en verificar eso, ya que la aplicación estaba funcionando principalmente.

Por ejemplo, mi aplicación se llama deathvalleydogs . Tuve dos modelos:

 class Trip(ModelBase): dogs = models.ManyToManyField(Dog, related_name="trips") class Dog(ModelBase): name = models.CharField(max_length=200) 

cuando intenté mostrar una plantilla para un Trip una lista de los Dogs que estaban en el viaje de esta manera:

 {% for dog in trip.dogs.all %} 
  • {{ dog.name }}
  • {% endfor %}

    entonces me salió un error de:

     Cannot resolve keyword u'trips' into field. Choices are: active, birth_date, ... 

    Aunque todavía era capaz de mostrar una plantilla para un Dog enumera los viajes en los que estaban. Tenga en cuenta que los trips deberían haber sido un campo creado por m2m en los objetos Dog . No estaba haciendo referencia a ese campo en la plantilla, pero de todos modos se barfó en ese campo en el modo de depuración.

    Desearía que el error hubiera sido más explícito, pero estoy tan feliz que finalmente encontré mi error.

    Puedes intentar restablecer las migraciones:

    1. Elimine todos los archivos de migración dentro de su proyecto. Recorra cada una de las carpetas de migración de aplicaciones de sus proyectos ( your_app / migrations / ) y elimine todo lo que haya dentro, excepto el archivo init .py.
    2. Ejecuta makemigrations y migrate .