【问题标题】:Auth filter full name认证过滤器全名
【发布时间】:2013-07-29 19:04:10
【问题描述】:

我需要根据全名过滤用户(来自 auth.user)。我知道我可以通过user.get_full_name() 来称呼用户的全名,但是是否可以按此属性进行过滤?

我需要做类似user = User.objects.filter( ... ) 的操作,但我需要为其提供一个属性。是否有一些我可以使用的属性?

【问题讨论】:

    标签: django django-authentication django-users


    【解决方案1】:

    不幸的是,这不是财产。

    Django 用户模型中可用的属性是

    • 用户名
    • 密码
    • 电子邮件
    • 名字
    • 姓氏

    但是无论如何做过滤器看起来像这样

    User.object.filter(first_name="Jimminy", last_name="Cricket")
    

    您可以做的是创建一个自定义形式的个人资料。

    class UserProfile(models.Model):
       full_name = models.CharField()
       user = models.ForeignKey(User)
    
       def save(self, *args, **kwargs):
          self.full_name = "Jimminy Cricket" #but not hardcoded ofc.
          super(UserProfile, self).save(*args, **kwargs)
    

    并像这样过滤它

    profile = UserProfile.objects.get(full_name="Jimminy Cricket")
    print profile.user
    

    15/4-2018 更新

    您也可以使用Q object 来实现同样的目的

    from django.db.models import Q
    from django.contrib.auth import get_user_model
    
    UserModel = get_user_model()
    UserModel.objects.filter(Q(first_name='Jiminy'), Q(last_name='Cricket'))
    

    这将输出以下 SQL

    'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE ("auth_user"."first_name" = Jiminy AND "auth_user"."last_name" = Cricket)'
    

    从而摆脱了中间模型/形式。

    【讨论】:

    • 是的。我想这是我能做的最好的了。我将拆分输入(来自用户):name=name.split(' '),然后是user = User.objects.filter(first_name=name[0], last_name=name[1])
    • 这似乎是最好的解决方案,但也是 Django 查询语言的极端限制的一个例子!
    • @NielsAbildgaard 我没有必要将其称为受限 - 我的意思是 get_full_name 仍然是一个 python 属性,并且与 SQL 完全无关。如果您想下拉到原始 SQL,否则使用 Q 对象在这里也会有所帮助。 User.objects.filter(Q(first_name='Jiminy'), Q(last_name='Cricket'))我相信。
    【解决方案2】:

    要根据用户的全名进行过滤,您可以首先使用每个用户的全名annotate 查询集,然后根据该注释进行过滤。

    from django.db.models import Value
    from django.db.models.functions import Concat
    
    
    User.objects.annotate(
        full_name=Concat('first_name', Value(' '), 'last_name')
    ).filter(full_name__icontains='J Biz')
    

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 1970-01-01
      • 2018-12-09
      • 2023-01-18
      • 1970-01-01
      • 2023-03-29
      • 2013-12-09
      • 2018-11-21
      • 2012-10-15
      相关资源
      最近更新 更多