2013-10-02 10 views
6

To jest bardzo dziwny błąd. Dostaję go tylko na moim serwerze heroku.FieldError: Nie można znaleźć słowa kluczowego "XXXX" w polu

Oto jak mój model jest:

# 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='e.g. France') 
    official_name = models.CharField('Official Name', max_length=400, blank=True, help_text='e.g. French Republic') 
    population = models.IntegerField('Population', help_text='Population must be entered as numbers with no commas or separators, e.g. 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 

Przy próbie uzyskania dostępu do elementów Wiadomości z serwisu Admin na mój serwer produkcyjny, otrzymuję ten błąd (wszystko działa poprawnie na mój serwer dev):

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))) 

Uruchomiłem te same wersje django (1.5.4) i Pythona (2.7.2) w moich środowiskach produkcyjnych i programistycznych.

Mój serwer produkcyjny jest Heroku

jakieś pomysły co może wyzwala błąd?

UPDATE:

admin.py config jest następująca:

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

Tak dzieje się, gdy uzyskasz dostęp do administratora? Czy możesz umieścić swój kod pliku admin.py? – jproffitt

+0

Wszędzie, gdzie potrzebuję dostępu do relacji ManyToMany. – AlirezaJ

+0

Czy możesz opublikować odpowiedni kod, który powoduje błąd? – jproffitt

Odpowiedz

10

Wreszcie udało mi się rozwiązać ten problem.

Po pierwsze, udało mi się zreplikować błąd w moim lokalnym środowisku. Najpierw testowałem aplikację przy użyciu wbudowanego serwera Django. Jednak moim środowiskiem produkcyjnym jest Heroku, który używa Gunicorn jako serwera WWW. Kiedy przełączyłem się na Gunicorn i brygadzistę na moim lokalnym serwerze, udało mi się odtworzyć błąd.

Po drugie, próbowałem wskazać problem, przeglądając modele i dodając/usuwając różne komponenty, pola. Aby lepiej wyjaśnić ten proces, muszę dodać brakujący fragment do pierwotnego pytania.

Opis, który napisałem powyżej, jest niepełny. Mam inny model w moim models.py, którego nie uwzględniłem w oryginalnym pytaniu, ponieważ uważałem, że nie jest to istotne. Oto pełna model:

# 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='e.g. France') 
    official_name = models.CharField('Official Name', max_length=400, blank=True, help_text='e.g. French Republic') 
    population = models.IntegerField('Population', help_text='Population must be entered as numbers with no commas or separators, e.g. 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 

Mój model konstrukcja nie wymaga ForeignKey na stole osoby, więc postanowił iść z prostego Charfield i zamiast używać zwykłego menu rozwijanego. Jednak z jakiegoś powodu Gunicorn podnosi wyżej wymieniony błąd, gdy w ramach get_country_names(), tabela Country jest wywoływana przed wiadomościami. Jak tylko usunąłem get_country_names() i przekręciłem pole kraju na stole Person w zwykły CharField, problem został rozwiązany.

Czytanie komentarzy w this old Django bug i this post przez Chase Seiberta znacznie pomogło mi w tym procesie.

Chociaż wydaje się, że bilet nr 1796 został naprawiony ponad 6 lat temu, wydaje się, że niektóre drobne problemy nadal pozostają głęboko w nim zakopane.

To wszystko! Dziękuję wszystkim.

2

Miałem kilka relacji ManyToMany, które działały w jedną stronę. Miałem problemy z ustawieniami i kilkakrotnie zmieniałem nazwę głównej aplikacji. Gdzieś wzdłuż linii usunąłem go z sekcji INSTALLED_APPS! Po dodaniu go ponownie zadziałało. Zdecydowanie PEBKAC, ale może to komuś pomoże. Zajęło mi trochę czasu, aby pomyśleć o sprawdzeniu, ponieważ aplikacja była w większości działa.Na przykład moja aplikacja nosi nazwę deathvalleydogs. Miałem dwa modele:

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

class Dog(ModelBase): 
    name = models.CharField(max_length=200) 

kiedy starałem się pokazać szablon dla Trip wymieniając Dogs które były na wycieczce jak ta:

{% for dog in trip.dogs.all %} 
    <li><a href="/dogs/{{ dog.id }}">{{ dog.name }}</a></li> 
{% endfor %} 

następnie Mam błąd:

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

Chociaż wciąż byłem w stanie pokazać szablon dla Dog z listą wycieczek, na których były. Zauważ, że trips powinno być polem utworzonym przez m2m obiektów Dog. Nie odwoływałem się do tego pola w szablonie, ale w tym trybie zrezygnowałem z tego pola w trybie debugowania.

Chciałbym, aby błąd był bardziej wyraźny, ale jestem po prostu szczęśliwy, że w końcu znalazłem swój błąd !!!

3

Dodawanie do możliwych sytuacji, w których tak się dzieje. Szukałem pola, którego nie można znaleźć w żadnym z moich modeli.

Po wyszukaniu kodu stwierdziłem, że odnotowałem zestaw pytań z takim polem, a następnie przesłałem ten zestaw zapytań jako wyszukiwanie __in do innego (wraz z innymi złożonymi zapytaniami).

Moja praca polegała na zmianie tego zestawu zapytań z adnotacjami w celu zwrócenia identyfikatorów i użycia tego. W tym konkretnym przypadku wynik był zawsze mały, więc lista identyfikatorów nie stanowiła problemu.

Powiązane problemy