如何在Django用户模型中搜索对象

问题描述

我有一个个人资料模型:

from django.contrib.auth.models import User

class Profile(models.Model):
    first_name = models.CharField(max_length=100,blank=True)
    last_name = models.CharField(max_length=100,blank=True)
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    birthday = models.DateField(null=True,blank=True)
    bio = models.TextField(blank=True,max_length=1000)
    location = models.CharField(max_length=100,blank=True)
    ...

和搜索联系人视图:

class SearchContactsView(ListView):
    model = Profile
    template_name = 'users/contact_search.html'
    context_object_name = 'qs'

    def get_queryset(self):
        q1 = self.request.GET.get('contact_name')
        q2 = self.request.GET.get('contact_location')

        if q1 or q2:
            return Profile.objects.filter(Q(first_name__icontains=q1) |
                                          Q(last_name__icontains=q1),location__icontains=q2)

        return Profile.objects.all()

它工作正常,但我也希望能够通过用户字段搜索联系人。有人知道这样做的方法吗?

EDIT (我的用户的用户名)是他们在注册该网站时创建的,目前无法编辑。由于它们是OneToOneField,因此会通过下拉列表显示在管理页面上。我认为我的问题是django仅将它们识别为IntegerField('pk'),但我需要以某种方式将其强制转换为字符串值。我是这样认为的,如果可以的话,如何实现?

enter image description here

解决方法

您可以添加到模板中,以允许用户输入user_username并将该用户名保存到q3:

q3 = self.request.GET.get('user_username')

之后,您可以相应地调整If条件,然后将返回值更改为:

Profile.objects.filter(Q(first_name__icontains=q1) |
                                          Q(last_name__icontains=q1),location__icontains=q2,user__username=q3)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...