【问题标题】:Troubleshooting "Related Field has invalid lookup: icontains"疑难解答“相关字段的查找无效:​​icontains”
【发布时间】:2012-07-30 02:11:21
【问题描述】:

我在models.py有以下型号:

class ListinoTraduttore(models.Model):
        traduttore = models.ForeignKey('Traduttore', related_name='Traduttore')
        linguaDa = models.ForeignKey(Lingua, related_name = "linguaDa")
        linguaA = models.ForeignKey(Lingua, related_name = "linguaA")
        prezzoParola = models.CharField(max_length=50, blank=True)
        prezzoRiga = models.CharField(max_length=50, blank=True)
        scontoCat = models.CharField(max_length=50, blank=True)
        scontoFuzzy = models.CharField(max_length=50, blank=True)
        scontoRipetizioni = models.CharField(max_length=50, blank=True)
        class Meta:
                verbose_name_plural = "Listini Traduttori"
        def __unicode__(self):
                return u"%s Da %s A %s Parola=%s Riga=%s ScontoCAT=%s ScontoFuzzy=%s ScontoRipetizioni=%s" % (self.traduttore, self.linguaDa, self.linguaA, self.prezzoParola, self.prezzoRiga, self.scontoCat, self.scontoFuzzy, self.scontoRipetizioni)


class Traduttore(models.Model):
        nome = models.CharField(nomeString, max_length=50)
        cognome = models.CharField(cognomeString, max_length=50)
        nomeAzienda = models.CharField(nomeAziendaString, max_length=50, blank=True)
        codiceFiscale = models.CharField(codiceFiscaleString, max_length=50, blank=True)
        partitaIva = models.CharField(partitaIvaString, max_length=50, blank=True)
        indirizzo = models.CharField(indirizzoString, max_length=50, blank=True)
        telefono = models.CharField(telefonoString, max_length=50, blank=True)
        fax = models.CharField(faxString, max_length=50, blank=True)
        email = models.EmailField(max_length=50, blank=True)
        referente = models.CharField(referenteString, max_length=50, blank=True)
        valuta = models.ForeignKey(Valuta)
        metodoPagamento = models.ForeignKey(MetodoPagamento)
        datiBancari = models.CharField(datiBancariString, max_length=50, blank=True)
        programmiUtilizzati = models.ManyToManyField(Programma, blank=True)
        note = models.CharField(max_length=200, blank=True)
        listino = models.ManyToManyField(ListinoTraduttore, related_name='listino', blank=True)
        def __unicode__(self):
                return u"%s %s %s" % (self.nome, self.cognome, self.nomeAzienda)
        class Meta:
                verbose_name_plural = "Traduttori"

admin.py 中,我有以下内容:

class TraduttoreAdmin(admin.ModelAdmin):
        list_display = ("nome", "cognome", "nomeAzienda")
        search_fields = ["nome", "cognome", "nomeAzienda"]

class ListinoTraduttoreAdmin(admin.ModelAdmin):
        list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
        search_fields = ['traduttore__nome", "linguaDa", "linguaA"]

但是当我尝试在 ListinoTraduttore 表的管理页面中进行搜索时,出现以下错误:

TypeError at /admin/itrad/listinotraduttore/
Related Field has invalid lookup: icontains
Request Method: GET
Request URL:    http://127.0.0.1:8000/admin/itrad/listinotraduttore/?q=Fenicio
Django Version: 1.4.1
Exception Type: TypeError
Exception Value:    
Related Field has invalid lookup: icontains
Exception Location: /Library/Python/2.7/site-packages/django/db/models/fields/related.py in get_prep_lookup, line 142
Python Executable:  /usr/bin/python
Python Version: 2.7.2
Python Path:    
['/Users/nicolac/Documents/DjangoProjects/mysite',
 '/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Library/Python/2.7/site-packages']

【问题讨论】:

    标签: exception django-admin


    【解决方案1】:

    您是否尝试在ListinoTraduttoreAdmin 搜索字段中的那些Lingua 引用上添加__fieldname,例如:

    class ListinoTraduttoreAdmin(admin.ModelAdmin):        
        list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
        search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA_field2"]
    

    【讨论】:

    • 这只是一个非常无用的错误消息。这基本上是我的解决方案。供参考code.djangoproject.com/ticket/2331
    • 这对我来说是正确的答案。当我对任何 FOREIGN KEY 进行搜索时,修复了此问题。谢谢
    • 这应该是公认的答案,正如@seans 提到的,每次search_fields(django 1.11)上有外键时都会发生此错误。
    • 6 年后那个糟糕的错误信息仍然存在!
    • 8 年后,那条消息仍然扼杀了我们
    【解决方案2】:

    这是为了(希望)简化答案。

    不要过滤 ForeignKey 字段本身!


    改变这个

    search_fields = ['foreignkeyfield']
    

    到这里(注意两个下划线)

    search_fields = ['foreignkeyfield__name']
    

    name 表示与我们有 ForeignKey 关系的表中的字段名称。

    希望对你有帮助

    【讨论】:

    • 这是我想要的答案,顺便说一句,我试过了:search_fields = ['foreinkeyfield__foreinkeyfield__name'],它也可以。谢谢
    【解决方案3】:

    改用 Django 的双下划线约定。 docs foreignkeyfield__name

    Make sure you are not adding any Foreignkey or ManyToManyField to your search_field directly.

    class ListinoTraduttoreAdmin(admin.ModelAdmin):
        list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
        search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA__field2"]
    

    【讨论】:

    • 这是一个重要的提示!因此,如果您想搜索 ForeignKey,您应该明确搜索那里的属性(例如 my_related_object__first_attribute)。
    【解决方案4】:

    需要双下划线

    class exampleAdmin(admin.ModelAdmin):
     search_field = ('yourforeignkeyname__choosefieldnameinyourforeignkey')
    

    【讨论】:

    • 注意:需要双下划线
    【解决方案5】:

    这对我有用。

    使用 my_related_object__first_attribute 搜索外键的字段:

    search_fields = ('author__username', 'title')
    from models
    author = models.ForeignKey(User, on_delete=models.CASCADE,   related_name='blog_posts2')
    

    【讨论】:

      【解决方案6】:

      此错误主要发生在您尝试使用 ForeignKey 过滤时。我认为错误出现在 search_filelds 中。检查。 search_fields = ['traduttore__nome", "linguaDa", "linguaA"]。这两个 ForeignKey ("linguaDa", "linguaA") 是问题所在。删除它们。我认为这会有所帮助。

      【讨论】:

        【解决方案7】:

        这可能无法回答最初的问题,但是,我经常遇到类似的invalid lookup 错误,因为我在查找时不小心使用了_set,例如<model_name>_set 而不仅仅是 <model_name>

        基本上,我倾向于将related_query_namedefault_related_name 混淆 ,其中确实包括_set(另请参阅queries docsrelated manager docs)。

        来自lookups documentation

        它也可以向后工作。虽然它可以自定义,但默认情况下,您使用模型的小写名称在查找中引用“反向”关系。

        (我的重点)

        令人困惑的是默认 related_name(即<model_name>_set)与默认 related_query_name(即<model_name>)不同,但是如果您设置 custom related_name(或 default_related_name,通过模型 Meta 选项),则 也用作默认 related_query_name(如前所述在文档中)。

        【讨论】:

          【解决方案8】:

          这可能很奇怪

          search_fields = ['traduttore__nome']
          

          这样给出,单引号会产生错误。

          search_fields = ["traduttore__nome"]
          

          使用双引号可以解决问题

          foreignkeyfield__lookupfield  - this is the format
          

          【讨论】:

            【解决方案9】:

            在 admin.py 中添加

            admin.site.register(Traduttore, TraduttoreAdmin)
            admin.site.register(ListinoTraduttore, ListinoTraduttoreAdmin)
            

            查看链接https://docs.djangoproject.com/en/dev/intro/tutorial02/

            【讨论】:

            • 嗨,我做到了,但没有任何改变。我有同样的错误。您还有其他建议吗?
            • 这不起作用。我们需要访问的是外键字段。可以如下查找。 ` [foreignfield__name]`
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多