Khắc phục sự cố “Trường liên quan có tra cứu không hợp lệ: icontains”


96

Tôi có các mô hình sau trong 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"

Trong khi ở trong admin.pytôi có những thứ 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 ListinoTraduttorebảng, tôi gặp 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']

Câu trả lời:


149

Bạn đã thử thêm __fieldnamevào các Linguatham chiếu đó trong ListinoTraduttoreAdminsearch_fields chưa, như:

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

4
đó chỉ là một thông báo lỗi thực sự vô ích. Về cơ bản đây là giải pháp trong trường hợp của tôi. để biết mã tham chiếu.djangoproject.com/ticket/2331
seans

5
Đây là câu trả lời chính xác 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ỳ TỪ KHÓA NGOẠI TỆ nào. Cảm ơn
cnobile 19/1213

Đây phải là câu trả lời được chấp nhận, như @seans đã đề cập, lỗi này xảy ra mỗi khi có khóa ngoại trên search_fields (django 1.11).
Cyrlop

6 năm sau thông báo lỗi tồi tệ đó vẫn còn đó!
rbennell

106

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

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


Thay đổi điều này

search_fields = ['foreinkeyfield']

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

search_fields = ['foreinkeyfield__name']

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

Hi vọng điêu nay co ich


1
Đó là câu trả lời tôi muốn, BTW, tôi đã thử : search_fields = ['foreinkeyfield__foreinkeyfield__name'], nó cũng hoạt động. cảm ơn
CK

59

Đảm bảo rằng bạn không thêm trực tiếp bất kỳ Foreignkey hoặc ManyToManyField nào vào search_field của mình.

Thay vào đó, hãy sử dụng quy ước gạch dưới kép của Django. tài liệu

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

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

2

Cần gạch dưới kép

class exampleAdmin(admin.ModelAdmin):
 search_field = ('yourforeignkeyname__choosefieldnameinyourforeignkey')

Lưu ý: cần có gạch dưới kép
Azmol

0

Điều này đã làm việc cho tôi.

Tìm kiếm trường của khóa ngoại bằng my_inity_object__first_attribute:

search_fields = ('author__username', 'title')
from models
author = models.ForeignKey(User, on_delete=models.CASCADE,   related_name='blog_posts2')

0

Lỗi này, chủ yếu xảy ra khi bạn cố gắng lọc bằng ForeignKey. Tôi nghĩ rằng lỗi là trong search_filelds. Kiểm tra nó. search_fields = ['traduttore__nome "," linguaDa "," linguaA "]. Hai ForeignKey này (" linguaDa "," linguaA ") là vấn đề. Hãy xóa chúng đi. Tôi nghĩ điều này sẽ hữu ích.


0

Điều này có thể không trả lời câu hỏi ban đầu, nhưng tôi thường xuyên gặp phải một invalid lookuplỗi tương tự vì tôi vô tình sử dụng _settrong tra cứu, ví dụ: <model_name>_setthay vì chỉ <model_name>.

Về cơ bản, tôi có xu hướng nhầm lẫn giữa related_query_name với default_related_name , mà không bao gồm _set(xem thêm truy vấn tài liệutài liệu quản lý có liên quan ).

Từ tài liệu tra cứu :

Nó cũng hoạt động ngược. Trong khi nó có thể được tùy chỉnh, theo mặc định, bạn đề cập đến mối quan hệ "ngược" trong tra cứu bằng cách sử dụng tên chữ thường của mô hình .

(nhấn mạnh của tôi)

Điều khó hiểu là mặc định related_name (tức là <model_name>_set) không giống với mặc định related_query_name (tức là <model_name>), nhưng nếu bạn đặt một tùy chỉnh related_name (hoặc default_related_name, thông qua Metacác tùy chọn mô hình ), cái đó cũng sẽ được sử dụng làm mặc định related_query_name(như đã đề cập trong tài liệu).


-2

thêm vào admin.py

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

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


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

Điều này không hoạt động. Những gì chúng ta cần truy cập là trường khóa ngoại. có thể được tra cứu như sau. `[Foreignfield__name]`
Laban funky monky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.