Fehlerbehebung "Zugehöriges Feld hat ungültige Suche: icontains"

90

Ich habe die folgenden Modelle in 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"

In der admin.py habe ich folgendes:

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"]

Wenn ich jedoch versuche, auf der Administrationsseite in der ListinoTraduttore-Tabelle eine Suche durchzuführen, tritt der folgende Fehler auf:

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']
user1545895
quelle

Antworten:

143

Haben Sie versucht , indem die __fieldnameauf diesen LinguaReferenzen in dem ListinoTraduttoreAdminsearch_fields, wie:

class ListinoTraduttoreAdmin(admin.ModelAdmin):        
    list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
    search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA_field2"]
bskinnersf
quelle
4
Es ist nur eine wirklich nicht hilfreiche Fehlermeldung. Dies war im Grunde die Lösung in meinem Fall. Referenz code.djangoproject.com/ticket/2331
seans
4
Das war die richtige Antwort für mich. Dieses Problem wurde behoben, als ich nach einem AUSLÄNDISCHEN SCHLÜSSEL suchte. Danke
cnobile
Dies sollte die akzeptierte Antwort sein, wie @seans erwähnt. Dieser Fehler tritt jedes Mal auf, wenn sich ein Fremdschlüssel in den Suchfeldern befindet (django 1.11).
Cyrlop
6 Jahre später ist diese beschissene Fehlermeldung immer noch da!
Rbennell
96

Dies soll (hoffentlich) die Antwort vereinfachen.

Filtern Sie nicht nach einem ForeignKey-Feld selbst !


Ändere das

search_fields = ['foreinkeyfield']

zu (ZWEI Unterstriche beachten)

search_fields = ['foreinkeyfield__name']

name stellt den Feldnamen aus der Tabelle dar, mit der wir eine ForeinKey-Beziehung haben.

Hoffe das hilft

Dror
quelle
1
Es ist die Antwort, die ich will, übrigens, ich habe versucht: search_fields = ['foreinkeyfield__foreinkeyfield__name']Es funktioniert auch. danke
CK
58

Stellen Sie sicher, dass Sie Ihrem Suchfeld keinen Fremdschlüssel oder ManyToManyField direkt hinzufügen.

Verwenden Sie stattdessen die Doppelunterstrich-Konvention von Django. docs

class ListinoTraduttoreAdmin(admin.ModelAdmin):
    list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
    search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA__field2"]
Kwaw Annor
quelle
13
Dies war ein wichtiger Hinweis! Wenn Sie also einen ForeignKey durchsuchen möchten, sollten Sie dort explizit nach den Attributen suchen (z. B. my_related_object__first_attribute).
OBu
2

Doppelter Unterstrich erforderlich

class exampleAdmin(admin.ModelAdmin):
 search_field = ('yourforeignkeyname__choosefieldnameinyourforeignkey')
Azmol
quelle
Hinweis: Doppelter Unterstrich erforderlich
Azmol
0

Das hat bei mir funktioniert.

Durchsuchen Sie das Feld des Fremdschlüssels mit my_related_object__first_attribute:

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

in admin.py hinzufügen

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

siehe den Link https://docs.djangoproject.com/de/dev/intro/tutorial02/

Michele Casari
quelle
Hallo, ich habe es getan, aber nichts hat sich geändert. Ich habe den gleichen Fehler. Haben Sie weitere Vorschläge?
user1545895
Das funktioniert nicht. Wir müssen auf das Fremdschlüsselfeld zugreifen. was wie folgt nachgeschlagen werden kann. `[Foreignfield__name]`
Laban Funky Monky