Memecahkan masalah "Bidang Terkait memiliki pencarian yang tidak valid: icontains"

98

Saya memiliki model berikut di 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"

Sedangkan di admin.pyI memiliki yang berikut:

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

Tetapi ketika saya mencoba melakukan pencarian di halaman admin di ListinoTraduttoretabel saya mengalami kesalahan berikut:

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

Jawaban:

150

Sudahkah Anda mencoba menambahkan __fieldnamepada Linguareferensi tersebut di ListinoTraduttoreAdminsearch_fields, seperti:

class ListinoTraduttoreAdmin(admin.ModelAdmin):        
    list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
    search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA_field2"]
bskinnersf
sumber
4
itu hanya pesan kesalahan yang sangat tidak membantu. Ini pada dasarnya adalah solusi dalam kasus saya. untuk kode
berlayar
5
Ini adalah jawaban yang benar untuk saya. Memperbaiki masalah ini ketika saya melakukan pencarian pada FOREIGN KEY mana pun. Terima kasih
cnobile
Ini harus menjadi jawaban yang diterima, seperti yang disebutkan @seans, kesalahan ini terjadi setiap kali ada kunci asing di search_fields (django 1.11).
Cyrlop
6 tahun kemudian pesan kesalahan jelek itu masih ada!
rbennell
106

Ini untuk (semoga) menyederhanakan jawabannya.

Jangan memfilter bidang ForeignKey itu sendiri !


Ubah ini

search_fields = ['foreinkeyfield']

ke (perhatikan DUA garis bawah)

search_fields = ['foreinkeyfield__name']

name mewakili nama bidang dari tabel yang memiliki hubungan ForeinKey dengannya.

Semoga ini membantu

Dror
sumber
1
Ini adalah jawaban yang saya inginkan, BTW, saya mencoba search_fields = ['foreinkeyfield__foreinkeyfield__name']:, berhasil juga. terima kasih
CK
59

Pastikan Anda tidak menambahkan Foreignkey atau ManyToManyField ke search_field Anda secara langsung.

Gunakan konvensi garis bawah ganda Django sebagai gantinya. dokumen

class ListinoTraduttoreAdmin(admin.ModelAdmin):
    list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
    search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA__field2"]
Kwaw Annor
sumber
13
Ini adalah catatan penting! Jadi jika Anda ingin mencari ForeignKey, Anda harus mencari atribut di sana (mis. My_related_object__first_attribute).
OBu
3

Perlu garis bawah ganda

class exampleAdmin(admin.ModelAdmin):
 search_field = ('yourforeignkeyname__choosefieldnameinyourforeignkey')
Azmol
sumber
Catatan: diperlukan garis bawah ganda
Azmol
0

Ini berhasil untuk saya.

Cari bidang kunci asing menggunakan 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
sumber
0

Kesalahan ini, sebagian besar terjadi saat Anda mencoba memfilter menggunakan ForeignKey. Saya pikir kesalahannya ada di search_filelds. Periksa. search_fields = ['traduttore__nome "," linguaDa "," linguaA "]. Dua ForeignKey (" linguaDa "," linguaA ") ini adalah masalahnya. Singkirkan. Saya rasa ini membantu.

Edem Robin
sumber
0

Ini mungkin tidak menjawab pertanyaan awal, tetapi, sering kali saya mengalami invalid lookupkesalahan serupa karena saya tidak sengaja menggunakan _setpencarian, misalnya, <model_name>_setbukan hanya <model_name>.

Pada dasarnya, saya cenderung mengacaukan related_query_name dengan default_related_name , yang memang termasuk _set(lihat juga dokumen kueri dan dokumen manajer terkait ).

Dari dokumentasi pencarian :

Ia bekerja mundur juga. Meskipun dapat disesuaikan, secara default Anda merujuk ke hubungan "terbalik" dalam pencarian menggunakan nama model huruf kecil .

(penekanan saya)

Membingungkan hal adalah bahwa standar related_name (yaitu <model_name>_set) tidak sama dengan standar related_query_name (yaitu <model_name>), tetapi jika Anda menetapkan kustom related_name (atau default_related_name, melalui Model Metapilihan), yang akan juga digunakan sebagai default related_query_name(seperti yang disebutkan dalam dokumen).

djvg
sumber
-2

tambahkan admin.py

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

lihat tautan https://docs.djangoproject.com/en/dev/intro/tutorial02/

Michele Casari
sumber
Hai, saya melakukannya tetapi tidak ada yang berubah. Saya mempunyai kesalahan yang sama. Apakah Anda punya saran lain?
pengguna1545895
Ini tidak bekerja. Yang perlu kami akses adalah bidang kunci asing. yang dapat dicari sebagai berikut. `[foreignfield__name]`
Laban funky monky