2012-08-01 12 views
53

Mam następujące modele w models.py:Rozwiązywanie problemów "pokrewnej dziedzinie ma nieprawidłową odnośnika: icontains"

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" 

ile w admin.py mam następujące:

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

Ale kiedy I starać się wyszukać na stronie administratora w tabeli ListinoTraduttore mam następujący błąd:

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

Odpowiedz

101

Czy próbowałeś dodanie __fieldname na tych Lingua odniesień w ListinoTraduttoreAdmin search_fields, jak:

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

to po prostu niepomocny komunikat o błędzie. To było w zasadzie rozwiązanie w moim przypadku. dla odniesienia https://code.djangoproject.com/ticket/2331 – seans

+2

To była poprawna odpowiedź dla mnie. Naprawiono ten problem, gdy szukałem jakiegoś klucza OBCEGO. Dzięki – cnobile

43

Upewnij się, że nie dodajemy żadnych ForeignKey lub ManyToManyField do Twoje pole wyszukiwania bezpośrednio.

Zamiast tego użyj konwencji podwójnego podkreślenia Django. docs

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

To była ważna uwaga! Więc jeśli chcesz przeszukać ForeignKey, powinieneś explicitely wyszukiwać atrybuty (np. My_related_object__first_attribute). – OBu

26

To (mam nadzieję) uprościć odpowiedź.

Nie filtruj w polu ForeignKey jako takim!


Zmiana ta

search_fields = ['foreinkeyfield'] 

do (zauważ DWA podkreślenia)

search_fields = ['foreinkeyfield__name'] 

name reprezentuje pole-name z tabeli, że mamy relację z ForeinKey.

Mam nadzieję, że to pomoże

Powiązane problemy