2012-08-01 49 views
53

tôi đã mô hình sau đây trong models.py:khắc phục sự cố "liên quan Dòng có tra cứu không hợp lệ: 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" 

Trong khi trong admin.py tôi có như sau:

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

Nhưng khi Tôi cố gắng thực hiện tìm kiếm trong trang quản trị trong bảng ListinoTraduttore Tôi có lỗi sau:

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

Trả lời

0

thêm vào admin.py

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

thấy liên kết https://docs.djangoproject.com/en/dev/intro/tutorial02/

+0

Xin chào, tôi đã làm nhưng không có gì thay đổi. Tôi có lỗi tương tự. Bạn có bất cứ lời đề nghị khác? – user1545895

101

Các bạn đã thử thêm __fieldname trên những tài liệu tham khảo Lingua trong ListinoTraduttoreAdmin search_fields, như:

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

nó chỉ là một thông báo lỗi thực sự vô ích. Đây là giải pháp cơ bản trong trường hợp của tôi. để tham khảo https://code.djangoproject.com/ticket/2331 – seans

+2

Đây là câu trả lời đúng cho tôi. Đã khắc phục sự cố này khi tôi thực hiện tìm kiếm trên bất kỳ KEY NGOẠI HỐI nào. Cảm ơn – cnobile

43

Hãy chắc chắn rằng bạn không thêm bất kỳ ForeignKey hoặc ManyToManyField để search_field của bạn trực tiếp.

Sử dụng quy tắc gạch dưới đôi của Django để thay thế. docs

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

Đây là một lưu ý quan trọng! Vì vậy, nếu bạn muốn tìm kiếm một ForeignKey, bạn nên rõ ràng serch cho các thuộc tính đó (ví dụ: my_related_object__first_attribute). – OBu

26

Đây là (hy vọng) đơn giản hóa câu trả lời.

Không lọc trên trường ForeignKey chính nó!


Thay đổi này

search_fields = ['foreinkeyfield'] 

đến (chú ý dấu gạch HAI)

search_fields = ['foreinkeyfield__name'] 

name đại diện cho lĩnh vực tên từ bảng mà chúng ta có mối quan hệ với ForeinKey.

Hy vọng điều này sẽ giúp

Các vấn đề liên quan