FieldError: невозможно удалить ключевое слово 'XXXX' в поле

Это очень странная ошибка. Я получаю его только на своем сервере герою.

Вот как моя модель:

# 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

Когда я пытаюсь получить доступ к элементам новостей из сайта Admin на моем рабочем сервере, я получаю эту ошибку (все отлично работает на моем 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)))

Я запускаю те же версии django (1.5.4) и python (2.7.2) в моей среде разработки и разработки.

Мой сервер производства Heroku

Любые идеи, которые могут вызвать ошибку?

UPDATE

Конфигурация admin.py выглядит следующим образом:

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)

Ответ 1

Наконец, я смог решить проблему.

Во-первых, мне удалось воспроизвести ошибку в локальной среде. Сначала я тестировал приложение с помощью встроенного сервера Django. Тем не менее, моя производственная среда - Heroku, которая использует Gunicorn в качестве веб-сервера. Когда я переключился на Gunicorn и бригадир на моем локальном сервере, я смог воспроизвести ошибку.

Во-вторых, я попытался указать проблему, просмотрев модели и добавив/удалив разные компоненты, поля. Чтобы лучше объяснить процесс, я должен добавить недостающую часть к исходному вопросу.

Описание, которое я написал выше, является неполным. У меня есть еще одна модель в моих моделях .py, которую я не включил в свой первоначальный вопрос, потому что я думал, что это не имеет значения. Вот полная модель:

# 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

Мой дизайн модели не требовал таблицы ForeignKey for Person, поэтому я решил пойти с простым CharField и вместо этого использовать обычное раскрывающееся меню. Однако по какой-то причине Gunicorn поднимает вышеупомянутую ошибку, когда, как часть get_country_names(), таблица Country вызывается перед новостью. Как только я удалил get_country_names() и превратил поле страны в таблицу Person в обычный CharField, проблема была решена.

Чтение комментариев в эта старая ошибка Django и этот пост Chase Seibert значительно помог мне в этом процессе.

Несмотря на то, что билет № 1796 исправлен более 6 лет назад, кажется, что некоторые крошечные проблемы по-прежнему остаются глубоко погребенными там.

Вот оно! Всем спасибо.

Ответ 2

Добавление к возможным ситуациям, при которых это происходит. Я искал поле, которое невозможно найти ни в одной из моих моделей.

Поиск по коду я обнаружил, что я аннотировал набор запросов с таким полем, а затем загружал этот запрос в качестве поиска __in в другой (по другим сложным запросам).

Моя работа заключалась в том, чтобы изменить этот аннотированный запрос для возврата идентификаторов и использовать его. В этом конкретном случае этот результат всегда был небольшим, поэтому список идентификаторов не был проблемой.

Ответ 3

У меня было несколько отношений ManyToMany, которые работали в одну сторону. Я уже возился со своими настройками и несколько раз менял название основного приложения. Где-то рядом, я удалил его из раздела INSTALLED_APPS! Как только я добавил, что вернулся, тогда это сработало. Определенно PEBKAC, но, возможно, это когда-нибудь поможет кому-то. Мне потребовалось некоторое время, чтобы подумать об этом, потому что приложение в основном работало.

Например, мое приложение называется deathvalleydogs. У меня было две модели:

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

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

когда я попытался показать шаблон для Trip, в котором перечислены теги Dogs, которые были в пути:

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

то я получил ошибку:

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

Хотя мне еще удалось показать шаблон для Dog, в котором перечислены поездки, в которых они были. Обратите внимание, что trips должно быть полем, созданным m2m для объектов Dog. Я не ссылался на это поле в шаблоне, но в любом случае он был включен в это поле в режиме отладки.

Я хочу, чтобы ошибка была более явной, но я так счастлив, что, наконец, нашел свою ошибку!!!

Ответ 4

Я использовал неверный поиск в поле поиска модели администратора, например:

Не работает:

class SomeAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "thing_id",
        "count",
        "stuff_name",
        "stuff_id"
    )
    readonly_fields = ("count")
    # These cannot be resolved, because "stuff" doesn't exist on the model
    search_fields = ("stuff__name", "stuff__id")

    def stuff_name(self, obj):
        return obj.thing.stuff.name

    def stuff_id(self, obj):
        return obj.thing.stuff.id

    def get_queryset(self, request):
        return super().get_queryset(request).select_related("thing")

За работой:

class SomeAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "thing_id",
        "count",
        "stuff_name",
        "stuff_id"
    )
    readonly_fields = ("count")
    search_fields = ("thing__stuff__name", "thing__stuff__id", "thing__id")

    def stuff_name(self, obj):
        return obj.thing.stuff.name

    def stuff_id(self, obj):
        return obj.thing.stuff.id

    def get_queryset(self, request):
        return super().get_queryset(request).select_related("thing")

Ответ 5

Вы можете попробовать сбросить миграцию:

  1. Удалите все файлы миграции в вашем проекте. Перейдите в каждую папку миграции приложений вашего проекта (your_app/migrations/) и удалите все внутри, кроме файла init.py.
  2. Запуск makemigrations и migrate.