2012-08-01 211 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关系表中的字段名。

希望这会有所帮助