Risoluzione dei problemi "Il campo correlato ha una ricerca non valida: icontains"


98

Ho i seguenti modelli 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"

Mentre in admin.pyho quanto segue:

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

Ma quando provo a fare una ricerca nella pagina di amministrazione nella ListinoTraduttoretabella ho il seguente errore:

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

Risposte:


150

Hai provato ad aggiungere __fieldnamesu quei Linguariferimenti in ListinoTraduttoreAdminsearch_fields, come:

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

4
è solo un messaggio di errore davvero inutile. Questa era fondamentalmente la soluzione nel mio caso. per codice di
seans

5
Questa è stata la risposta corretta per me. Risolto questo problema quando ho effettuato una ricerca su qualsiasi CHIAVE ESTERA. Grazie
cnobile

Questa dovrebbe essere la risposta accettata, come menzionato da @seans, questo errore si verifica ogni volta che è presente una chiave esterna nei campi_ricerca (django 1.11).
Cyrlop

6 anni dopo quel messaggio di errore scadente è ancora lì!
rbennell

106

Questo per (si spera) semplificare la risposta.

Non filtrare su un campo ForeignKey stesso !


Cambia questo

search_fields = ['foreinkeyfield']

a (notare DUE trattini bassi)

search_fields = ['foreinkeyfield__name']

name rappresenta il nome del campo della tabella con cui abbiamo una relazione ForeinKey.

Spero che sia di aiuto


1
È la risposta che voglio, a proposito, ho provato: search_fields = ['foreinkeyfield__foreinkeyfield__name']funziona anche tu. grazie
CK

59

Assicurati di non aggiungere direttamente alcuna Foreignkey o ManyToManyField al tuo campo_ricerca.

Usa invece la convenzione del doppio trattino basso di Django. documenti

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

13
Questa è stata una nota importante! Quindi, se vuoi cercare una ForeignKey, dovresti cercare esplicitamente gli attributi lì (ad esempio my_related_object__first_attribute).
OBu

2

Necessario doppio trattino basso

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

Nota: è necessario un doppio trattino basso
Azmol

0

Questo ha funzionato per me.

Cerca nel campo della chiave esterna utilizzando 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

Questo errore si verifica principalmente quando si tenta di filtrare utilizzando una ForeignKey. Penso che l'errore sia in search_filelds. Controllalo. search_fields = ['traduttore__nome "," linguaDa "," linguaA "]. Queste due ForeignKey (" linguaDa "," linguaA ") sono il problema. Rimuovile. Penso che questo aiuti.


0

Questo potrebbe non rispondere alla domanda originale, ma ogni tanto mi imbatto in un invalid lookuperrore simile perché ho usato accidentalmente _setin una ricerca, ad esempio <model_name>_setinvece di solo <model_name>.

Fondamentalmente, tendo a confondere related_query_name con default_related_name , che include _set(vedi anche i documenti delle query e i documenti del gestore correlati ).

Dalla documentazione delle ricerche :

Funziona anche al contrario. Sebbene possa essere personalizzato, per impostazione predefinita si fa riferimento a una relazione "inversa" in una ricerca utilizzando il nome minuscolo del modello .

(la mia enfasi)

La cosa confusa è che il default related_name (ie <model_name>_set) non è lo stesso del default related_query_name (ie <model_name>), ma se imposti un custom related_name (o default_related_name, tramite le Metaopzioni del modello ), questo sarà anche usato come default related_query_name(come menzionato nei documenti).


-2

aggiungi in admin.py

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

vedere il collegamento https://docs.djangoproject.com/en/dev/intro/tutorial02/


Ciao, l'ho fatto ma non è cambiato nulla. Ho lo stesso errore. Hai altri suggerimenti?
user1545895

Questo non funziona. Ciò a cui dobbiamo accedere è il campo della chiave esterna. che può essere consultato come segue. `[foreignfield__name]`
Laban funky monky
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.