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

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

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


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

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

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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.