这是一个非常奇怪的错误。我只在我的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)
答案 0 :(得分:11)
最后,我能够解决这个问题。
首先,我设法在我的本地环境中复制错误。起初,我使用内置的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
我的模型设计不需要PersonK的表的ForeignKey,所以我决定使用简单的CharField,而是使用常规的下拉菜单。但是,出于某种原因,当作为get_country_names()的一部分,在新闻之前调用Country表时,Gunicorn会引发上述错误。一旦我删除了get_country_names()并将Person表上的country字段转换为常规CharField,问题就解决了。
阅读Chase Seibert撰写的this old Django bug和this post中的评论对我的过程有很大帮助。
虽然票号#1796似乎是在6年前修复的,但似乎仍有一些小问题仍然深埋在那里。
多数民众赞成!感谢大家。
答案 1 :(得分:3)
添加发生这种情况的可能情况。我搜索了我的任何模型中都找不到的字段。
搜索代码时,我发现我用这样的字段注释了一个查询集,然后将该查询集作为__in
搜索提供给另一个(沿着其他复杂的查询)。
我的工作是更改带注释的查询集以返回ID并使用它。在这种特殊情况下,结果总是很小,因此ID列表不是要传递的问题。
答案 2 :(得分:2)
我有一些单向工作的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
应该是Dog
个对象上m2m创建的字段。我没有在模板中引用该字段,但无论如何它在调试模式下都禁止该字段。
我希望错误更明确,但我很高兴我终于找到了错误!!!
答案 3 :(得分: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")
答案 4 :(得分: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()
答案 5 :(得分:-1)
您可以尝试重置迁移:
makemigrations
和migrate
。