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

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

Dror
fuente
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"]
Kwaw Annor
fuente
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')
Azmol
fuente
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')
Ibby
fuente
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.

Edem Robin
fuente
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).

djvg
fuente
-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/

Michele Casari
fuente
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