0

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

我需要做类似的事情user = User.objects.filter( ... ),但我需要给它一个属性。是否有一些我可以使用的属性?

4

2 回答 2

1

不幸的是,不是作为财产。

Django User 模型中的可用属性是

  • 用户名
  • 密码
  • 电子邮件

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

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

2018 年 15 月 4 日更新

您也可以通过使用Q 对象来实现相同的目的

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

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

于 2013-07-29T19:08:10.513 回答
1

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

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')
于 2019-03-07T20:43:06.903 回答