Rozwiązywanie problemów „Pole pokrewne ma nieprawidłowe wyszukiwanie: icontains”

98

Mam następujące modele w 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"

Będąc w admin.pyposiadam:

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

Ale kiedy próbuję wyszukiwać na stronie administratora w ListinoTraduttoretabeli, pojawia się następujący błąd:

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
źródło

Odpowiedzi:

150

Czy próbowałeś dodać __fieldnamete Linguaodniesienia w ListinoTraduttoreAdminsearch_fields, na przykład:

class ListinoTraduttoreAdmin(admin.ModelAdmin):        
    list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
    search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA_field2"]
bskinnersf
źródło
4
to po prostu bardzo nieprzydatny komunikat o błędzie. To było w zasadzie rozwiązanie w moim przypadku. dla odniesienia code.djangoproject.com/ticket/2331
seans
5
To była dla mnie poprawna odpowiedź. Naprawiono ten problem, gdy szukałem dowolnego KLUCZA OBCEGO. Dzięki
cnobile,
Powinna to być akceptowana odpowiedź, jak wspomniał @seans, ten błąd pojawia się za każdym razem, gdy w search_fields (django 1.11) znajduje się klucz obcy.
Cyrlop
6 lat później ten kiepski komunikat o błędzie wciąż tam jest!
rbennell
106

Ma to (miejmy nadzieję) uprościć odpowiedź.

Nie filtruj według samego pola ForeignKey !


Zmień to

search_fields = ['foreinkeyfield']

do (zauważ DWA podkreślenia)

search_fields = ['foreinkeyfield__name']

name reprezentuje nazwę pola z tabeli, z którą mamy relację ForeinKey.

Mam nadzieję że to pomoże

Dror
źródło
1
To jest odpowiedź, której chcę, przy okazji, próbowałem: search_fields = ['foreinkeyfield__foreinkeyfield__name']to też działa. dzięki
CK
59

Upewnij się, że nie dodajesz żadnego klucza obcego ani ManyToManyField bezpośrednio do pola wyszukiwania.

Zamiast tego użyj konwencji podwójnego podkreślenia Django. dokumenty

class ListinoTraduttoreAdmin(admin.ModelAdmin):
    list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
    search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA__field2"]
Kwaw Annor
źródło
13
To była ważna uwaga! Więc jeśli chcesz przeszukać ForeignKey, powinieneś jawnie wyszukać tam atrybuty (np. My_related_object__first_attribute).
OBu
2

Wymagane podwójne podkreślenie

class exampleAdmin(admin.ModelAdmin):
 search_field = ('yourforeignkeyname__choosefieldnameinyourforeignkey')
Azmol
źródło
Uwaga: potrzebne jest podwójne podkreślenie
Azmol
0

To zadziałało dla mnie.

Przeszukaj pole klucza obcego za pomocą 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
źródło
0

Ten błąd występuje głównie podczas próby filtrowania za pomocą klucza obcego. Myślę, że błąd jest w search_filelds. Sprawdź to. search_fields = ['traduttore__nome "," linguaDa "," linguaA "]. Problem stanowią dwa klucze ForeignKey (" linguaDa "," linguaA "). Usuń je. Myślę, że to pomaga.

Edem Robin
źródło
0

To może nie odpowiadać na pierwotne pytanie, ale co jakiś czas invalid lookupnapotykam podobny błąd, ponieważ przypadkowo użyłem go _setw wyszukiwaniu, np. <model_name>_setZamiast po prostu <model_name>.

Zasadniczo mylę related_query_name z default_related_name , które obejmuje _set(zobacz także dokumenty zapytań i powiązane dokumenty menedżera ).

Z dokumentacji wyszukiwania :

Działa również wstecz. Chociaż można go dostosować, domyślnie odwołujesz się do relacji „odwrotnej” w wyszukiwaniu, używając nazwy modelu małymi literami .

(moje podkreślenie)

Mylące jest to, że wartość domyślna related_name (tj. <model_name>_set) Nie jest tym samym, co domyślna related_query_name (tj. <model_name>), Ale jeśli ustawisz niestandardową related_name (lub default_related_nameza pomocą Metaopcji modelu ), będzie ona również używana jako domyślna related_query_name(jak wspomniano w dokumentacji).

djvg
źródło
-2

dodaj admin.py

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

zobacz link https://docs.djangoproject.com/en/dev/intro/tutorial02/

Michele Casari
źródło
Cześć, zrobiłem to, ale nic się nie zmieniło. Mam ten sam błąd. Czy masz jakieś inne sugestie?
user1545895
To nie działa. To, czego potrzebujemy, to pole klucza obcego. które można wyszukać w następujący sposób. `[Foreignfield__name]`
Laban funky monky