2013-10-02 13 views
6

Đây là một lỗi rất lạ. Tôi chỉ nhận được nó trên máy chủ heroku của tôi.FieldError: Không thể giải quyết từ khóa 'XXXX' vào trường

Sau đây là cách mô hình của tôi là:

# 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 

Khi tôi cố gắng truy cập vào mục Tin tức từ quản trị trang web trên máy chủ sản xuất của tôi, tôi nhận được lỗi này (tất cả mọi thứ hoạt động tốt trên máy chủ dev của tôi):

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

Tôi chạy cùng phiên bản django (1.5.4) và python (2.7.2) trên môi trường sản xuất và phát triển của mình.

máy chủ sản xuất của tôi là Heroku

Bất kỳ ý tưởng những gì có thể kích hoạt lỗi?

CẬP NHẬT:

admin.py cấu hình như sau:

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

Điều này xảy ra khi bạn truy cập quản trị viên? Bạn có thể đăng mã tập tin admin.py của mình không? – jproffitt

+0

Bất cứ nơi nào tôi cần truy cập vào mối quan hệ ManyToMany. – AlirezaJ

+0

Bạn có thể đăng mã có liên quan tạo ra lỗi không? – jproffitt

Trả lời

10

Cuối cùng, tôi đã có thể giải quyết vấn đề.

Trước tiên, tôi đã quản lý để nhân rộng lỗi trong môi trường cục bộ của mình. Lúc đầu, tôi đã thử nghiệm các ứng dụng bằng cách sử dụng built-in Django runserver. Tuy nhiên, môi trường sản xuất của tôi là Heroku sử dụng Gunicorn làm máy chủ web. Khi tôi chuyển sang Gunicorn và foreman trên máy chủ cục bộ của mình, tôi đã có thể tái tạo lỗi.

Thứ hai, tôi đã cố gắng xác định vấn đề bằng cách xem qua các mô hình và thêm/xóa các thành phần, trường khác nhau. Để giải thích quy trình tốt hơn, tôi phải thêm một phần còn thiếu vào câu hỏi gốc.

Mô tả tôi đã đăng ở trên là loại chưa hoàn chỉnh. Tôi có một mô hình khác trong models.py của tôi rằng tôi không đưa vào câu hỏi ban đầu của tôi, bởi vì tôi nghĩ nó không liên quan. Đây là mô hình hoàn chỉnh:

# 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 

Thiết kế mô hình của tôi không yêu cầu bàn phím của ForeignKey for Person, thay vào đó, hãy sử dụng menu thả xuống thường xuyên. Tuy nhiên, vì một số lý do, Gunicorn nêu ra lỗi nêu trên khi, như một phần của get_country_names(), bảng Country được gọi trước News. Ngay sau khi tôi xóa get_country_names() và biến trường quốc gia trên bảng Person thành một CharField thông thường, vấn đề đã được giải quyết.

Đọc qua các nhận xét trong this old Django bugthis post bởi Chase Seibert đã giúp tôi rất nhiều trong quá trình này.

Mặc dù vé số # 1796 dường như được cố định cách đây hơn 6 năm, có vẻ như một số vấn đề nhỏ vẫn còn bị chôn sâu ở đó.

Thats it! Cảm ơn mọi người.

2

Tôi đã có một số mối quan hệ ManyToMany hoạt động một chiều. Tôi đã được rối tung xung quanh với các thiết lập của tôi và thay đổi tên của ứng dụng chính một vài lần. Một nơi nào đó dọc theo các dòng, tôi đã xóa nó khỏi phần INSTALLED_APPS! Khi tôi thêm nó vào, thì nó hoạt động. Chắc chắn PEBKAC, nhưng có lẽ điều này sẽ giúp một ai đó một ngày nào đó. Phải mất một thời gian tôi mới nghĩ đến việc kiểm tra điều đó, vì ứng dụng hầu hết hoạt động.

Ví dụ: ứng dụng của tôi được gọi là deathvalleydogs. Tôi đã có hai mô hình:

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

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

khi tôi đã cố gắng để hiển thị một mẫu cho một Trip liệt kê các Dogs đã có trên hai chuyến đi như thế này:

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

sau đó tôi đã nhận ra lỗi của:

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

Mặc dù tôi vẫn có thể hiển thị mẫu cho số Dog liệt kê các chuyến đi mà họ đã đi. Lưu ý rằng trips phải là một trường được tạo bởi m2m trên các đối tượng Dog. Tôi đã không tham chiếu đến trường đó trong khuôn mẫu, nhưng nó đã bị chặn trên trường đó ở chế độ gỡ lỗi.

Tôi muốn lỗi đã rõ ràng hơn, nhưng tôi rất hạnh phúc vì cuối cùng tôi đã tìm thấy lỗi của mình !!!

3

Thêm vào các tình huống có thể xảy ra theo đó điều này xảy ra. Tôi đã tìm kiếm trường không thể tìm thấy trong bất kỳ mô hình nào của tôi.

Tìm kiếm trên mã Tôi thấy rằng tôi đã chú thích một bộ truy vấn với trường như vậy và sau đó cung cấp truy vấn đó làm một tìm kiếm __in cho một truy vấn khác (cùng với các truy vấn phức tạp khác).

Công việc của tôi xung quanh là thay đổi tập hợp truy vấn được chú thích đó để trả lại ID và sử dụng ID đó. Trong trường hợp cụ thể này, kết quả sẽ luôn nhỏ nên danh sách các ID không phải là vấn đề để vượt qua.

Các vấn đề liên quan