トラブルシューティング「関連フィールドのルックアップが無効です:icontains」


97

私は次のモデルを持っています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']

回答:


149

次のように、search_fieldsで__fieldnameこれらのLingua参照にを追加してみましたListinoTraduttoreAdminか。

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

4
本当に役に立たないエラーメッセージです。これが私の場合の基本的な解決策でした。参照コード.djangoproject.com
ticket

5
これは私にとって正解でした。FOREIGNKEYで検索を行ったときのこの問題を修正しました。ありがとう
cnobile 2013

@seansが述べたように、これは受け入れられた答えであるはずです。このエラーは、search_fields(django 1.11)に外部キーがあるたびに発生します。
Cyrlop 2018年

6年後、そのくだらないエラーメッセージはまだそこにあります!
rbennell 2018

106

これは(うまくいけば)答えを単純化するためです。

ForeignKeyフィールド自体をフィルタリングしないでください


これを変える

search_fields = ['foreinkeyfield']

to(2つのアンダースコアに注意)

search_fields = ['foreinkeyfield__name']

name ForeinKey関係を持つテーブルのフィールド名を表します。

お役に立てれば


1
それは私が望む答えです、ところで、私は試しました:search_fields = ['foreinkeyfield__foreinkeyfield__name']、それも機能します。感謝
CK

59

search_fieldにForeignkeyまたはManyToManyFieldを直接追加していないことを確認してください。

代わりに、Djangoの二重アンダースコア規則を使用してください。ドキュメント

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

13
これは重要なメモでした!したがって、ForeignKeyを検索する場合は、そこで属性(my_related_object__first_attributeなど)を明示的に検索する必要があります。
OBu 2013年

2

二重下線が必要

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

注:二重アンダースコアが必要
Azmol

0

これは私のために働いた。

my_related_object__first_attributeを使用して外部キーのフィールドを検索します。

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

0

このエラーは、ほとんどの場合、ForeignKeyを使用してフィルタリングしようとしたときに発生します。エラーはsearch_fileldsにあると思います。確認してください。search_fields = ['traduttore__nome "、" linguaDa "、" linguaA "]。この2つのForeignKey(" linguaDa "、" linguaA ")が問題です。それらを削除してください。これは役立つと思います。


0

これは元の質問に答えられないかもしれませんが、ルックアップでinvalid lookup誤って使用_setしたため、たとえば<model_name>_set、だけではなく、同じようなエラーが発生することがよくあります<model_name>

基本的に、私はrelated_query_namedefault_related_nameと混同する傾向があります。default_related_name には含まれています_setクエリのドキュメント関連するマネージャーのドキュメントも参照してください)。

ルックアップドキュメントから:

逆方向にも機能します。カスタマイズすることもできますが、デフォルトでは、モデルの小文字の名前を使用してルックアップで「逆」の関係を参照します。

(私の強調)

事を混乱することはということであるデフォルト related_name(つまり<model_name>_set)と同じではありませんデフォルト related_query_name(つまり<model_name>)、しかし、あなたが設定されている場合は、カスタム related_name(またはdefault_related_name、モデルを経てMetaオプションを)、それがされますまた、デフォルトとして使用することrelated_query_name(ドキュメントで述べたように)。


-2

admin.pyに追加

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

リンクhttps://docs.djangoproject.com/en/dev/intro/tutorial02/を参照してください


こんにちは、私はそれをしましたが、何も変わりません。同じエラーが発生します。他に何か提案はありますか?
user1545895 2012

これは動作しません。アクセスする必要があるのは、外部キーフィールドです。これは次のように調べることができます。`[foreignfield__name]`
ラバンファンキーモンキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.