갈루아의 반서재


위의 Related Field got invalid lookup: icontains 에러는 ForeignKey가 검색 필드에 포함되어 일어나는 에러다.

아래의 예를 통해 살펴보자.


아래의 예제는 세션을 관리하는 모델로, mstusers가 ForeignKey로 MstUser 모델의 사용자 정보를 가져오도록 되어 있다.


models.py

1
2
3
4
5
6
7
8
9
10
class MstSession(models.Model):
    sesskey = models.CharField(max_length=64,  primary_key=True, null=False, verbose_name="Session")
    mstusers = models.ForeignKey('MstUser', db_column='usn'null=True)
    remote_ip = models.CharField(max_length=50, verbose_name="IP")
    login_dt =models.DateTimeField(verbose_name="접속일시")
 
    class Meta:
        managed = False
        db_table = 'mst_session' 
cs



하단의 admin.py 파일에서 ForeignKey 를 통해 사용자의 이름 등 사용자 정보를 mstusers를 통해 참조해 보여주고 있으며, 그리고 FK__fieldname, 즉 아래의 예에서는 mstusers__nm 와 같은 방식으로 사용자 이름으로도 검색을 할 수 있게 하였다. 그런데 사용자 이름을 검색창에 넣어서 검색하면 아래와 같은 결과를 나오는데, 그 이유가 바로 FK 인 mstusers 가 검색 필드에 포함되어 있어서이다. 그러므로, mstusers 를 검색필드에서 제거하면 정상적으로 검색 결과를 볼 수 있다.


admin.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MstSessionAdmin(admin.ModelAdmin):
    model = MstSession
    readonly_fields = ('sesskey',)
    
    def get_queryset(self, request):
        qs = super(MstSessionAdmin, self).get_queryset(request)
        return qs.select_related('mstusers')
 
    def user_name(self, obj):
        return obj.mstusers.nm
        user_name.short_description = 'Name'  
 
    fieldsets = [
        ('Session',       {'fields': ['sesskey']}),
        (None,             {'fields': ['userusn']}),
        (None,             {'fields': ['remote_ip']}),
        (None,             {'fields': ['login_dt']}),
    ]
    list_display = ('sesskey',  'user_name''remote_ip''login_dt')
    list_filter = ['login_dt']
    search_fields = ['mstusers''remote_ip''mstusers__nm']
    ordering = ('-login_dt',)    
cs