【发布时间】:2013-07-29 19:04:10
【问题描述】:
我需要根据全名过滤用户(来自 auth.user)。我知道我可以通过user.get_full_name() 来称呼用户的全名,但是是否可以按此属性进行过滤?
我需要做类似user = User.objects.filter( ... ) 的操作,但我需要为其提供一个属性。是否有一些我可以使用的属性?
【问题讨论】:
标签: django django-authentication django-users
我需要根据全名过滤用户(来自 auth.user)。我知道我可以通过user.get_full_name() 来称呼用户的全名,但是是否可以按此属性进行过滤?
我需要做类似user = User.objects.filter( ... ) 的操作,但我需要为其提供一个属性。是否有一些我可以使用的属性?
【问题讨论】:
标签: django django-authentication django-users
不幸的是,这不是财产。
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])
get_full_name 仍然是一个 python 属性,并且与 SQL 完全无关。如果您想下拉到原始 SQL,否则使用 Q 对象在这里也会有所帮助。 User.objects.filter(Q(first_name='Jiminy'), Q(last_name='Cricket'))我相信。
要根据用户的全名进行过滤,您可以首先使用每个用户的全名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')
【讨论】: