Python 将模型之外的字段合并到预先存在的数据库中的正确方法

Python 将模型之外的字段合并到预先存在的数据库中的正确方法,python,django,Python,Django,我正在使用一个名为Employee的现有数据库。我有三个单独的字段,我想合并成一个字段,但我不能向预先存在的数据库中添加其他字段 我知道使用python将多个字段合并为一个字段的正确方法是 '%s - %s %s' % (self.username, self.firstname, self.lastname) 然而,我不能在模型之外称self,或者至少我不确定在哪里称self 我的最终目标是有一个带有组合字段的选择框,用户可以搜索first、last或account name。我当前的模型如

我正在使用一个名为Employee的现有数据库。我有三个单独的字段,我想合并成一个字段,但我不能向预先存在的数据库中添加其他字段

我知道使用python将多个字段合并为一个字段的正确方法是

'%s - %s %s' % (self.username, self.firstname, self.lastname)
然而,我不能在模型之外称self,或者至少我不确定在哪里称self

我的最终目标是有一个带有组合字段的选择框,用户可以搜索first、last或account name。我当前的模型如下所示:

class Employee(models.Model):
        staff_id = models.IntegerField(db_column = 'Employee_ID')
        status_id = models.IntegerField(db_column = 'StatusID')
        username = models.CharField(db_column = 'SamAccountName',primary_key = True, max_length = 31)
        lastname = models.CharField(db_column = 'Surname', max_length = 63)
        firstname = models.CharField(db_column = 'GivenName', max_length = 63)
        title = models.CharField(db_column = 'Title', max_length = 127)

        class Meta:
            managed = False
            db_table = '[Employee]'
我试图添加到我的模型中,但当我调用full_username时,它表示该字段不存在,这是正确的,因为数据库中没有字段。我们不允许向数据库中添加新字段

def get_full_name(self):

        full_username = '%s - %s %s' % (self.username, self.firstname, self.lastname)

        return full_username.split()
理想情况下,我希望我的视图看起来像这样(我知道它不会“按原样工作”,我会将其替换为“完整用户名”):


如何将全名添加到视图中,我的逻辑遗漏了什么,或者将全名放在正确的位置?

首先,尝试以良好的方式格式化字符串

full_username='{}-{}{}{}'。格式(self.username、self.firstname、self.lastname)

其次,您可以在模型中使用方法
获取\u full\u name()
,并从模型对象调用它

employee=employee.objects.get(id=1)
全名=员工。获取全名()

这应该行得通

尝试使用:

来自django.db导入模型的

班级负责人(models.Model):
first_name=models.CharField(最大长度=50)
last_name=models.CharField(最大长度=50)
出生日期=models.DateField()
def婴儿潮一代状态(自我):
“返回该人的婴儿潮一代状态。”
导入日期时间
如果自出生日期<日期时间日期(1945年8月1日):
返回“前婴儿潮”
elif self.birth_date
如果您不需要QuerySet的功能,请尝试以下方法

activeuserlist = [
    '{} - {} {}'.format(user.username, user.firstname, user.lastname)
    for user in Employee.objects.filter(staff_id = '1')
]

如果您确实需要查询集,我认为在python级别上是不可能的,只能在SQL级别上。请参见注释。

您可以尝试一下:

from django.db.models.functions import Concat
from django.db.models import F, Value

employees = Employee.objects.annotate(full_username=Concat(F('username'), Value(' - '), F('firstname'), Value(' '), F('lastname')))\
    .filter(staff_id='1', full_username__icontains='hello')
icontains位只是一个演示,通过此查询,您还可以根据组合名称过滤结果


如果您必须在任何地方使用它,那么我建议您在模型中创建自己的queryset/manager,然后将此注释放入默认queryset。之后,您可以在任何地方使用您的完整用户名过滤器,而无需首先添加批注。

这仅适用于只有一名员工的情况,但我正在寻找所有活动的员工。如果您循环列表,您将获得单个对象,并且您可以以相同的方式访问该列表,这是相同的…我得到'QuerySet'对象没有使用以下属性'get_full_username'。Employee.objects.all()activeempoloyee=employist.get_full_username我的模型显示如下:@property def full_username(self):full_username='{}-{}{}'。格式(self.username,self.firstname,self.lastname)返回(full_username)当我尝试在视图中调用full_username或获取full_username时,它仍然表示不存在任何属性。是否使用属性装饰器?是的,我在模型中添加了以下内容:@property def full_username(self):full_username='{}-{}{}'。格式(self.username,self.firstname,self.lastname)然后我返回完整的用户名当我尝试使用concat时,它会给我以下属性错误:无法设置属性[25/Jan/2018 12:06:25]“GET/account/profile/HTTP/1.1”500 96620可能是因为我没有尝试筛选到单个用户名,而是一个列表。您可能需要引用实际的列名,而不是别名,例如F('username'))如果是F('SamAccountName'),我试过了,但它仍然在/account/profile/处抛出AttributeError,无法设置attribute我能看到你的查询吗?activeuserlist=Employee.objects.annotate(full\u username=Concat(F('SamAccountName')、Value('-')、F('givenname')、Value(''、F('姓氏'))\.filter(staff\u id='1'))当我尝试原始设置时,它抛出了一个错误,为我提供了存在的字段名列表,在我更正后,我得到了cannotset属性错误。
activeuserlist = [
    '{} - {} {}'.format(user.username, user.firstname, user.lastname)
    for user in Employee.objects.filter(staff_id = '1')
]
from django.db.models.functions import Concat
from django.db.models import F, Value

employees = Employee.objects.annotate(full_username=Concat(F('username'), Value(' - '), F('firstname'), Value(' '), F('lastname')))\
    .filter(staff_id='1', full_username__icontains='hello')