2012-08-01 160 views
53

我在models.py以下型號:故障排除 「相關領域具有無效查詢: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" 

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

回答

0

add in admin.py

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

看到鏈接https://docs.djangoproject.com/en/dev/intro/tutorial02/

+0

嗨,我做到了,但沒有任何變化。我有同樣的錯誤。你有什麼其他的建議? – user1545895 2012-08-01 12:03:43

101

你有沒有嘗試添加這些Lingua引用__fieldnameListinoTraduttoreAdmin search_fields,如:

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

這只是一個非常無益的錯誤消息。這基本上是我的情況下的解決方案。供參考https://code.djangoproject.com/ticket/2331 – seans 2013-01-18 20:05:28

+2

這對我來說是正確的答案。解決了這個問題,當我在任何FOREIGN KEY上搜索時。謝謝 – cnobile 2013-12-19 14:29:53

43

確保您不添加任何外鍵或ManyToManyField來你的search_field直接。

改爲使用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

這是一個重要的筆記!所以如果你想搜索一個ForeignKey,你應該明確地提供那裏的屬性(例如my_related_object__first_attribute)。 – OBu 2013-10-03 06:07:00

26

這是(希望)簡化答案。

不要過濾外鍵字段本身


更改此

search_fields = ['foreinkeyfield'] 

到(注意兩個下劃線)

search_fields = ['foreinkeyfield__name'] 

name表示,我們有一個ForeinKey關係表中的字段名。

希望這會有所幫助