Усунення несправностей "Пов’язане поле має недійсний пошук: значки"


94

У мене є такі моделі в 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']

Відповіді:


148

Чи пробували ви додати __fieldnameці Linguaпосилання у ListinoTraduttoreAdminполя_пошуку, наприклад:

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/

5
Це була правильна відповідь для мене. Виправлено цю проблему, коли я шукав будь-який ІНОЗЕМНИЙ КЛЮЧ. Подяка
cnobile

Це має бути прийнятою відповіддю, як згадував @seans, ця помилка виникає кожного разу, коли на полях пошуку є зовнішній ключ (django 1.11).
Кірлоп,

Через 6 років повідомлення про помилку все ще є!
rbennell

105

Це для (сподіваємось) спрощення відповіді.

Не фільтруйте саме поле ForeignKey !


Змініть це

search_fields = ['foreinkeyfield']

до (зауважте ДВА підкреслення)

search_fields = ['foreinkeyfield__name']

name представляє ім'я поля з таблиці, з яким ми маємо зв'язок ForeinKey.

Сподіваюся, це допомагає


1
Це відповідь, яку я хочу, до речі, я спробував:, 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

Це спрацювало для мене.

Шукайте поле зовнішнього ключа за допомогою 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]`
Лабан-фанк-манк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.