Solución de problemas "El campo relacionado tiene una búsqueda no válida: icontains"


98

Tengo los siguientes modelos en 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"

Mientras que en el admin.pytengo lo siguiente:

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

Pero cuando intento realizar una búsqueda en la página de administración de la ListinoTraduttoretabla, aparece el siguiente error:

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

Respuestas:


150

¿Ha intentado agregar __fieldnameen esas Linguareferencias en los ListinoTraduttoreAdmincampos de búsqueda, como:

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

4
es solo un mensaje de error realmente inútil. Esta fue básicamente la solución en mi caso. para el código de
— seans

5
Esta fue la respuesta correcta para mí. Se solucionó este problema cuando hice una búsqueda en cualquier LLAVE EXTRANJERA. Gracias
— cnobile

Esta debería ser la respuesta aceptada, como mencionó @seans, este error ocurre cada vez que hay una clave externa en los campos de búsqueda (django 1.11).
— Cyrlop

¡6 años después, ese horrible mensaje de error sigue ahí!
— rbennell

106

Esto es para (con suerte) simplificar la respuesta.

¡No filtre en un campo ForeignKey en sí !


Cambia esto

search_fields = ['foreinkeyfield']

a (observe DOS guiones bajos)

search_fields = ['foreinkeyfield__name']

name representa el nombre de campo de la tabla con la que tenemos una relación ForeinKey.

Espero que esto ayude


1
Es la respuesta que quiero, por cierto, lo intenté:, search_fields = ['foreinkeyfield__foreinkeyfield__name']también funciona. gracias
— CK

59

Asegúrese de no agregar ninguna Foreignkey o ManyToManyField a su campo de búsqueda directamente.

En su lugar, utilice la convención de subrayado doble de Django. docs

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

13
¡Esta fue una nota importante! Entonces, si desea buscar una ForeignKey, debe buscar explícitamente los atributos allí (por ejemplo, my_related_object__first_attribute).
— OBu

2

Se necesita doble subrayado

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

Nota: se necesita doble subrayado
— Azmol

0

Esto funcionó para mí.

Busque el campo de la clave externa usando 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

Este error ocurre principalmente cuando intenta filtrar usando ForeignKey. Creo que el error está en search_filelds. Revisalo. search_fields = ['traduttore__nome "," linguaDa "," linguaA "]. Estas dos ForeignKey (" linguaDa "," linguaA ") son el problema. Elimínelas. Creo que esto ayuda.


0

Es posible que esto no responda a la pregunta original, pero, de vez en cuando, me encuentro con un invalid lookuperror similar porque usé accidentalmente _seten una búsqueda, por ejemplo, en <model_name>_setlugar de solo <model_name>.

Básicamente, tiendo a confundir el related_query_name con el default_related_name , que sí incluye _set(ver también los documentos de consultas y los documentos del administrador relacionados ).

De la documentación de búsquedas :

También funciona al revés. Si bien se puede personalizar, de forma predeterminada se hace referencia a una relación "inversa" en una búsqueda utilizando el nombre del modelo en minúsculas .

(mi énfasis)

Confundiendo cosa es que el valor predeterminado related_name (es decir <model_name>_set) no es el mismo que el por defecto related_query_name (es decir <model_name>), pero si se establece una costumbre related_name (o default_related_name, a través de modelo Metaopciones), que va a ser utilizado también como el valor predeterminado related_query_name(como se menciona en los documentos).


-2

agregar admin.py

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

ver el enlace https://docs.djangoproject.com/en/dev/intro/tutorial02/


Hola, lo hice pero nada cambió. Yo tengo el mismo error. ¿Tiene alguna otra sugerencia?
— user1545895

Esto no funciona. Lo que necesitamos para acceder es el campo de clave externa. que se puede buscar de la siguiente manera. `[Foreignfield__name]`
— Laban funky monky
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.