Устранение неполадок «Связанное поле имеет недопустимый поиск: 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']
user1545895
источник

Ответы:

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"]
bskinnersf
источник
4
это просто действительно бесполезное сообщение об ошибке. В моем случае это было в основном решением. для справочного кода. djangoproject.com/ticket/2331
seans
5
Для меня это был правильный ответ. Исправлена ​​эта проблема, когда я выполнял поиск по любому ИНОСТРАННОМУ КЛЮЧУ. Спасибо
cnobile
Это должен быть принятый ответ, как упоминалось в @seans, эта ошибка возникает каждый раз, когда в search_fields есть внешний ключ (django 1.11).
Cyrlop
Спустя 6 лет это дерьмовое сообщение об ошибке все еще существует!
rbennell
106

Это должно (надеюсь) упростить ответ.

Не выполняйте фильтрацию по самому полю ForeignKey !


Изменить это

search_fields = ['foreinkeyfield']

в (обратите внимание на ДВА подчеркивания)

search_fields = ['foreinkeyfield__name']

name представляет имя поля из таблицы, с которой у нас есть отношения ForeinKey.

Надеюсь это поможет

Дрор
источник
1
Это тот ответ, который я хочу, кстати, я пробовал: search_fields = ['foreinkeyfield__foreinkeyfield__name']он тоже работает. спасибо
CK
59

Убедитесь, что вы не добавляете Foreignkey или ManyToManyField напрямую в search_field.

Вместо этого используйте соглашение Django о двойном подчеркивании. документы

class ListinoTraduttoreAdmin(admin.ModelAdmin):
    list_display = ("traduttore", "linguaDa", "linguaA", "prezzoParola", "prezzoRiga", "scontoCat", "scontoFuzzy", "scontoRipetizioni")
    search_fields = ['traduttore__nome", "linguaDa__field1", "linguaA__field2"]
Kwaw Annor
источник
13
Это было важное замечание! Поэтому, если вы хотите выполнить поиск по ForeignKey, вы должны явно искать там атрибуты (например, my_related_object__first_attribute).
OBu
3

Требуется двойное подчеркивание

class exampleAdmin(admin.ModelAdmin):
 search_field = ('yourforeignkeyname__choosefieldnameinyourforeignkey')
Азмол
источник
Примечание: необходимо двойное подчеркивание
Азмол
0

Это сработало для меня.

Найдите поле внешнего ключа, используя 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(как указано в документации).

djvg
источник
-2

добавить в admin.py

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

см. ссылку https://docs.djangoproject.com/en/dev/intro/tutorial02/

Мишель Казари
источник
Привет, я сделал это, но ничего не изменилось. У меня такая же ошибка. Есть ли у вас другие предложения?
user1545895 01
Это не работает. Нам нужно получить доступ к полю внешнего ключа. который можно найти следующим образом. `[foreignfield__name]`
напуганный монки Лавана