【问题标题】:django FieldError at /search/ Cannot resolve keyword 'searchkeyword'/search/ 处的 django FieldError 无法解析关键字“searchkeyword”
【发布时间】:2011-12-26 18:10:25
【问题描述】:

我正在阅读 Practical Django Projects 这本书,但我很难过。这本书适用于 Django 的早期版本。我正在使用 v1.3。

问题出在视图中,位于 'search_keyword_keyword__in...'

from django.contrib.flatpages.models import FlatPage
from django.shortcuts import render_to_response

def search(request):
    query = request.GET.get('q', '') 
    keyword_results = results = []
    if query:
        keyword_results = FlatPage.objects.filter(searchkeyword__keyword__in=query.split()).distinct()
        results = FlatPage.objects.filter(content__icontains=query)
    return render_to_response('search/search.html',
                    {'query' : query,
                     'keyword_results': keyword_results,
                     'results' : results })

models.py 是

from django.contrib.flatpages.models import FlatPage
from django.db import models

class SearchKeyword(models.Model):
    keyword = models.CharField(max_length=50)
    page = models.ForeignKey(FlatPage)

    def __unicode__(self):
        return self.keyword

完整的错误是:

Cannot resolve keyword 'searchkeyword' into field. Choices are: content, enable_comments, id, registration_required, sites, template_name, title, url

我认为这是 FlatPages 的选项。似乎没有找到外键关系。

任何想法可能是错误的或如何正确进行查找?谢谢。

这里是 admin.py,以防它有一些影响:

from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib import admin
from cms.search.models import SearchKeyword
from django.contrib.flatpages.models import FlatPage

# Define an inline admin descriptor for SearchKeywords model
class SearchKeywordInline(admin.TabularInline):
    model = SearchKeyword

# Define a FlatPageAdmin class
class ExtendedFlatPageAdmin(FlatPageAdmin):
    inlines = [
        SearchKeywordInline,
    ]

# Re-register FlatPageAdmin
admin.site.unregister(FlatPage)
admin.site.register(FlatPage, ExtendedFlatPageAdmin)

【问题讨论】:

  • settings.py中的INSTALLED_APPS中是否添加了包含SearchKeyword的应用?

标签: django filter foreign-keys django-queryset


【解决方案1】:

ForeignKey 的反向关系将命名为 searchkeyword_set(请参阅 https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects),因此您的查询集应将 searchkeyword_set__keyword__in 作为参数(或者您可以使用related_name。

如果这不起作用,你应该检查你是否已经完成了 manage.py syncdb ?

【讨论】:

  • 添加 _set 没有帮助。使用related_name 给出了相同的结果。
  • 我已经多次运行 manage.py syncdb 没有错误。我认为您在查看 ForeignKey 关系时是正确的,因为如果我注释掉有问题的行,下一行可以正常工作 - 这是另一个没有 ForeignKey 的过滤器。
  • 您提供的链接中的示例与我的代码之间的唯一区别是 ForeignKey 指向 FlatPage 而不是同一文件中的模型。
  • 我已经完成了您提到的页面上的示例。谢谢。我在搜索应用程序中创建了一个“虚拟”FlatPage2 模型。我能够执行: FlatPage2.objects.filter(fkpage2__keyword__contains='one') 其中 fkpage2 是 ForeignKey 的相关名称。但是当我尝试使用 Django 的 FlatPage 时出现错误:Flatpage.objects.filter(fkpage__keyword__contains='one')。错误是“FieldError:无法将关键字'fkpage'解析为字段。选项有:内容、enable_cmets、id、registration_required、站点、模板名称、标题、url”。如何跨应用建立关系?
【解决方案2】:

问题似乎是:

from django.contrib.flatpages.models import FlatPage
from django.db import models

模型需要先出现,例如:

from django.db import models
from django.contrib.flatpages.models import FlatPage

我认为发生的事情是在创建 ForeignKey 之前创建了 FlatPage 实例,因此 FlatPage 无法使用 SearchKeyword 属性。

【讨论】:

    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2021-05-23
    • 2013-10-09
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多