【问题标题】:Django auth.models.User query by full name but Chinese nameDjango auth.models.User 查询全名但中文名
【发布时间】:2014-01-03 09:50:31
【问题描述】:

中文名称格式为'LastnameFirstname'(Lastname 和Firstname 的字符数不同),而英文名称格式为'Firstname LastName'。我们可以看到在中文中,名字姓氏是交换的(这在此处查询不是问题),并且名字姓氏没有用空格分隔(这导致了我这个问题)。

在 SQL 中,我们可以这样做:

SELECT * 
FROM   USER 
WHERE  Concat(last_name, first_name) = 'LastnameFirstName'; 

但是我如何在 Django 中做到这一点?给定一个 FULLNAME 字符串为“LastnameFirstname”,我该怎么做:

User.objects.filter(last_name+firstname=FULLNAME)

另一个solution 是创建一个自定义用户模型并创建一个名为“全名”的新字段,但是这个解决方案使我无法使用其他 django 内置函数:

class User( models.Model ):
    first_name = models.CharField( max_length=64 )
    last_name = models.CharField( max_length=64 )
    full_name = models.CharField( max_length=128 )
    def save( self, *args, **kw ):
        self.full_name = '{0}{1}'.format( first_name, last_name )
        super( User, self ).save( *args, **kw )

我想会有更好的解决方案。

谢谢。 :)

【问题讨论】:

    标签: sql django


    【解决方案1】:

    您可以链接到User 模型并创建自己的类:

    class UserProfile(models.Model):
        user = models.OneToOneField(settings.AUTH_USER_MODEL)
    
        def full_name(self):
            return self.user.last_name + self.user.first_name
        ....
    

    或者您可以继承 AbstractUser 模型以在那里定义您自己的自定义用户属性:

    from django.contrib.auth.models import AbstractUser
    
    class MyUser(AbstractUser):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
    
        def full_name(self):
            return self.last_name + self.first_name
    

    然后在您的设置中将默认用户模型设置为您的新类:

    AUTH_USER_MODEL = 'myapp.MyUser'
    

    AbstractUser 模型只有 3 个属性:passwordlast_loginis_active。您可以自己定义其余部分。

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2012-05-17
      • 2017-07-22
      • 2012-04-10
      • 2014-07-24
      • 2021-01-24
      相关资源
      最近更新 更多