【问题标题】:How to search for objects in the Django User model如何在 Django 用户模型中搜索对象
【发布时间】:2020-11-03 05:54:40
【问题描述】:

我有一个 Profile 模型:

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()

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

编辑我的用户的用户名是他们在注册网站时创建的,目前不可编辑。它们通过下拉菜单显示在管理页面上,因为它们是 OneToOneField。我认为我的问题是 django 仅将它们识别为 IntegerField('pk') 但我需要以某种方式将它们转换为字符串值。我的想法对吗?如果是这样,如何实现?

【问题讨论】:

    标签: django search django-users


    【解决方案1】:

    您可以添加到您的模板以允许用户输入 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)
    

    【讨论】:

    • 感谢您的回复。我尝试了你的方法,但我没有选择通过user_username 仅搜索user,但是每次我通过user 搜索时,django 都期望一个数字为id
    • @sgt_pepper85 那么您可以发布您已经尝试过的任何内容吗?
    • 我尝试了user__icontains=q3user_username=q3user.username=q3 的几种变体。没有什么能像我想要的那样工作,因为我要么通过一个不存在的字段进行搜索,要么因为 Django 在我希望返回一个字符串时正在寻找一个“id”。我已经编辑了我的原始帖子,希望我现在想要实现的目标更有意义
    • @sgt_pepper85 我不知道你的 self.request.GET 返回什么。根据您的 self.request.GET 返回的内容调整q3 = self.request.GET.get('user_username')。我告诉过你在你的模板中添加一些东西来允许第三季度。
    • 我再次尝试了你的方法,在意识到我是个傻瓜之后,在('user_username ')的末尾添加了一个额外的空格。不管我输入什么值,它返回的是Profile.objects.all()
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多