18

这是一个非常奇怪的错误。我只在我的 heroku 服务器上收到它。

这是我的模型的样子:

# 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

当我尝试从生产服务器上的管理站点访问新闻项目时,我收到此错误(在我的开发服务器上一切正常):

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

有什么想法会触发错误吗?

更新

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

6 回答 6

21

最后,我能够解决这个问题。

首先,我设法在我的本地环境中复制了错误。起初,我使用内置的 Django runserver 测试应用程序。但是,我的生产环境是使用 Gunicorn 作为网络服务器的 Heroku。当我在本地服务器上切换到 Gunicorn 和工头时,我能够复制错误。

其次,我试图通过查看模型并添加/删除不同的组件、字段来确定问题所在。为了更好地解释这个过程,我必须在原始问题中添加一个缺失的部分。

我上面发布的描述有点不完整。我的models.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

我的模型设计不需要 Person 表的 ForeignKey,所以我决定使用简单的 CharField,而是使用常规的下拉菜单。但是,由于某种原因,当作为 get_country_names() 的一部分,在 News 之前调用 Country 表时,Gunicorn 会引发上述错误。一旦我删除了 get_country_names() 并将 Person 表上的 country 字段转换为常规 CharField ,问题就解决了。

阅读这个旧的 Django 错误中的评论和Chase Seibert 的这篇文章在这个过程中对我有很大帮助。

尽管ticket#1796 似乎在 6 多年前就已修复,但似乎一些小问题仍然深埋在那里。

而已!感谢大家。

于 2013-10-17T04:38:54.363 回答
7

添加到发生这种情况的可能情况。我搜索了在我的任何模型中都找不到的字段。

搜索代码我发现我正在用这样的字段注释查询集,然后将该查询集作为__in搜索提供给另一个(以及其他复杂查询)。

我的解决方法是更改​​带注释的查询集以返回 ID 并使用它。在这种特殊情况下,结果总是很小,因此通过 ID 列表不是问题。

于 2015-06-02T08:01:00.890 回答
3

我有一些单向工作的多对多关系。我一直在搞乱我的设置并多次更改主应用程序的名称。在某个地方,我已将其从该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对象上创建的字段。我没有在模板中引用该字段,但无论如何它在调试模式下都在该字段上。

我希望错误更明确,但我很高兴我终于找到了我的错误!!!

于 2014-12-29T21:26:25.997 回答
0

我在管理模型搜索字段中使用了错误的 dunder 查找,例如:

不工作:

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")
于 2019-06-03T20:07:27.690 回答
0

您可以尝试重置迁移:

  1. 删除项目中的所有迁移文件。浏览您的每个项目应用程序迁移文件夹 ( your_app/migrations/ ) 并删除其中的所有内容,除了init .py 文件。
  2. 运行makemigrationsmigrate
于 2019-03-27T11:04:15.020 回答
0

我有这个错误。如果您使用 POSTMAN 对 URL 进行 API 调用,那么您可能会遇到同样的错误。

django.core.exceptions.FieldError:无法将关键字“播放器”解析为字段。选择是...

在您的模型或序列化程序中,您指的是特定字段,例如player在我的情况下,就像当它被引用为外键时一样。

在我的例子中,我有一个 Player 模型,我想更新 Market 模型的 save 方法中的引用,当市场中的权重发生变化时,它应该立即反映在播放器上。

class Market(models.Model):
    player = models.ForeignKey(Player)
    weight = models.CharField('Weight') 
    ...

    def save(self):
        if self.weight:
             # wrong
             Player.objects.get(player=self.player) # this object reference of itself does not exist, hence the error
             # right
             Player.objects.get(pk=self.player.pk)
             ...
        super().save()
于 2020-04-16T16:28:00.873 回答