相关字段无效查找:icontains

时间:2016-01-26 11:36:31

标签: python django

我想在我的主页中包含一个搜索字段。它适用于某些模块字段。我的问题是当我使用ForeignKey字段时(如果我错了请纠正我)。

models.py

class Location(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    my_location = models.CharField(max_length=120, choices=LOCATION_CHOICES)
    update_date = models.DateField(auto_now=True, null=True)

    def __str__(self):
        return self.my_location


class UserProfile(models.Model):

    user = models.ForeignKey(User)
    # The additional attributes we wish to include.
    user_base = models.CharField(max_length=120, choices=LOCATION_CHOICES)
    user_position = models.CharField(max_length=120)
    user_phone = models.PositiveIntegerField()

    def __unicode__(self):
        return self.user.username

views.py

def search_by_location(request):
    if 'q' in request.GET and request.GET['q']:
        q = request.GET['q']
        locations = Location.objects.filter(my_location__icontains=q).order_by('-update_date')
    else:
        locations = Location.objects.order_by('-update_date')
context = {'locations': locations}
return render(request, 'index.html', context)

我的问题是如果我在过滤器查询中使用user而不是my_location我收到错误:

  

相关字段无效查找:icontains

请提供有关如何排除故障的建议或我可以阅读的任何文档。

2 个答案:

答案 0 :(得分:32)

您可以在文本字段上使用icontains查找。 user是相关(整数)字段。而不是user使用user__username

locations = Location.objects.filter(user__username__icontains=q)

答案 1 :(得分:0)

class SearchView(ListView):
model = Profile
template_name = 'blog/search_results.html'
context_object_name = 'all_search_results'
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    user_name = self.request.GET.get('search', '')
    context['all_search_results'] = Profile.objects.filter(user__username__icontains=user_name )
    return context  

这是另一个关于如何过滤对象的示例。如果搜索用户,请记住用户 user_username__icontains=user_name

还请记住,如果您使用 Profile,您将获得与使用 id 不同的 User