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

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

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


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

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

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

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.


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


-2

tambahkan admin.py

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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.