การแก้ไขปัญหา“ ช่องที่เกี่ยวข้องมีการค้นหาที่ไม่ถูกต้อง: icontains”


98

ฉันมีโมเดลต่อไปนี้ใน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"

ในขณะที่admin.pyฉันมีสิ่งต่อไปนี้:

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

แต่เมื่อฉันพยายามค้นหาในหน้าผู้ดูแลระบบในListinoTraduttoreตารางฉันพบข้อผิดพลาดต่อไปนี้:

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

คำตอบ:


150

คุณได้ลองเพิ่มการอ้างอิง__fieldnameเหล่านั้นLinguaในListinoTraduttoreAdminsearch_fields แล้วหรือยังเช่น:

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

4
มันเป็นเพียงข้อความแสดงข้อผิดพลาดที่ไม่เป็นประโยชน์ นี่เป็นวิธีแก้ปัญหาในกรณีของฉัน สำหรับรหัสอ้างอิงdjangoproject.com/ticket/2331
seans

5
นี่เป็นคำตอบที่ถูกต้องสำหรับฉัน แก้ไขปัญหานี้เมื่อฉันค้นหาคีย์ต่างประเทศ ขอบคุณ
cnobile

นี่ควรเป็นคำตอบที่ได้รับการยอมรับดังที่ @seans กล่าวถึงข้อผิดพลาดนี้เกิดขึ้นทุกครั้งที่มี Foreign Key บน search_fields (django 1.11)
Cyrlop

6 ปีต่อมาข้อความผิดพลาดเส็งเคร็งยังคงอยู่ที่นั่น!
rbennell

106

นี่คือ (หวังว่า) จะทำให้คำตอบง่ายขึ้น

อย่ากรองในช่อง ForeignKey เอง !


เปลี่ยนสิ่งนี้

search_fields = ['foreinkeyfield']

ถึง (สังเกตสองขีดล่าง)

search_fields = ['foreinkeyfield__name']

name แสดงถึงชื่อเขตข้อมูลจากตารางที่เรามีความสัมพันธ์ ForeinKey

หวังว่านี่จะช่วยได้


1
มันคือคำตอบที่ฉันต้องการ BTW ฉันลองsearch_fields = ['foreinkeyfield__foreinkeyfield__name']แล้วมันก็ใช้ได้เหมือนกัน ขอบคุณ
CK

59

ตรวจสอบให้แน่ใจว่าคุณไม่ได้เพิ่ม Foreignkey หรือ ManyToManyField ลงในช่องค้นหาของคุณโดยตรง

ใช้รูปแบบขีดล่างคู่ของ Django แทน เอกสาร

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

13
นี่เป็นบันทึกสำคัญ! ดังนั้นหากคุณต้องการค้นหา ForeignKey คุณควรค้นหาแอตทริบิวต์ที่นั่นอย่างชัดเจน (เช่น my_related_object__first_attribute)
OBu

2

ต้องการขีดล่างสองเท่า

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

หมายเหตุ: ต้องการขีดล่างสองครั้ง
Azmol

0

สิ่งนี้ได้ผลสำหรับฉัน

ค้นหาฟิลด์ของ Foreign Key โดยใช้ 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

ข้อผิดพลาดนี้ส่วนใหญ่เกิดขึ้นเมื่อคุณพยายามกรองโดยใช้ ForeignKey ฉันคิดว่าข้อผิดพลาดอยู่ใน search_filelds ตรวจสอบ. search_fields = ['traduttore__nome "," linguaDa "," linguaA "] ForeignKey (" linguaDa "," linguaA ") สองตัวนี้เป็นปัญหาลบออกฉันคิดว่านี่ช่วยได้


0

นี้อาจจะไม่ตอบคำถามเดิม แต่ทุกคนจึงมักจะใช้เป็นที่คล้ายกันinvalid lookupข้อผิดพลาดเพราะผมตั้งใจนำมาใช้_setในการค้นหาเช่นแทนเพียง<model_name>_set<model_name>

โดยทั่วไปฉันมักจะสับสนrelated_query_nameกับdefault_related_name ซึ่งรวมถึง_set(ดูเอกสารเคียวรีและเอกสารผู้จัดการที่เกี่ยวข้องด้วย )

จากเอกสารการค้นหา :

มันทำงานย้อนกลับด้วย ในขณะที่มันสามารถปรับแต่งตามค่าเริ่มต้นที่คุณอ้างถึงความสัมพันธ์“ย้อนกลับ” ในการค้นหาโดยใช้ชื่อตัวพิมพ์เล็กของรูปแบบ

(เน้นของฉัน)

สิ่งที่น่าสับสนคือค่าเริ่มต้น related_name (เช่น<model_name>_set) ไม่เหมือนกับค่าเริ่มต้น related_query_name (เช่น<model_name>) แต่ถ้าคุณตั้งค่าแบบกำหนดเอง related_name (หรือdefault_related_nameผ่านMetaตัวเลือกแบบจำลอง) สิ่งนั้นจะถูกใช้เป็นค่าเริ่มต้นด้วยrelated_query_name(ตามที่กล่าวไว้ในเอกสาร)


-2

เพิ่มใน admin.py

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

ดูลิงค์https://docs.djangoproject.com/en/dev/intro/tutorial02/


สวัสดีฉันทำไปแล้ว แต่ไม่มีอะไรเปลี่ยนแปลง ฉันมีข้อผิดพลาดเดียวกัน คุณมีคำแนะนำอื่น ๆ หรือไม่?
user1545895

สิ่งนี้ใช้ไม่ได้ สิ่งที่เราต้องเข้าถึงคือฟิลด์คีย์ต่างประเทศ ซึ่งสามารถค้นหาได้ดังนี้ `[Foreignfield__name]`
ลาบันขี้ขลาด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.