在预先存在的数据库中将模型外部的字段组合的正确方法

时间:2018-01-25 17:29:28

标签: python django

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

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

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

但是,我不能在模特之外打电话给自己,或者至少我不确定我会把自己称为自我。

我的最终目标是拥有一个带有组合字段的选择框,用户可以搜索第一个,最后一个或帐户名称。我目前的模型如下所示:

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'替换它):

activeuserlist = Employee.objects.filter(staff_id = '1').values_list('%s - %s %s' % (Employee.username, Employee.firstname, Employee.lastname), flat = True)  

如何将全名添加到我的视图中,我的逻辑中缺少什么,或者将它放在哪里?

4 个答案:

答案 0 :(得分:2)

你可以尝试一下:

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位只是一个演示,通过此查询,您可以根据组合名称过滤结果。

如果必须在任何地方使用它,那么我建议您在模型中创建自己的查询集/管理器,然后将此注释放入默认查询集中。之后,您可以在任何需要的位置使用full_username过滤器,而无需先添加注释。

答案 1 :(得分:0)

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

full_username = '{} - {} {}'.format(self.username, self.firstname, self.lastname)

其次,您可以在模型中使用方法get_full_name(),并从模型对象中调用它。

employee = Employee.objects.get(id=1) full_name = employee.get_full_name()

那应该有用。 :)

答案 2 :(得分:0)

尝试使用property

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        "Returns the person's baby-boomer status."
        import datetime
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"

    @property
    def full_name(self):
        "Returns the person's full name."
        return '%s %s' % (self.first_name, self.last_name)

答案 3 :(得分:0)

如果您不需要QuerySet的功能,请尝试使用

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

如果你需要一个QuerySet,我认为在python级别上它是不可能的,只能在SQL级别上。请参阅注释this thread