如何将计算字段添加到 Django 模型 [英] How to add a calculated field to a Django model
问题描述
我有一个简单的 Employee
模型,其中包括 firstname
、lastname
和 middlename
字段.
在管理方面,可能在其他地方,我想将其显示为:
lastname, firstname 中间名
对我来说,这样做的合乎逻辑的地方是在模型中创建一个计算字段:
from django.db 导入模型从 django.contrib 导入管理员类员工(模型.模型):lastname = models.CharField("Last", max_length=64)firstname = models.CharField("First", max_length=64)middlename = models.CharField("Middle", max_length=64)clocknumber = models.CharField(max_length=16)名称 = ''.join([lastname.value_to_string(),',',firstname.value_to_string(),' ',middlename.value_to_string()])元类:ordering = ['姓氏','名字','中间名']类员工管理(admin.ModelAdmin):list_display = ('clocknumber','name')fieldsets = [("姓名", {"字段":(("姓氏", "名字", "中间名"), "clocknumber")}),]admin.site.register(员工,员工管理员)
我认为最终我需要的是将名称字段的值作为字符串获取.我得到的错误是 value_to_string() 需要 2 个参数(1 个给定)
.字符串的值需要 self, obj
.我不确定 obj
是什么意思.
必须有一个简单的方法来做到这一点,我相信我不是第一个想要这样做的人.
下面是我根据丹尼尔的回答修改的代码.我得到的错误是:
<块引用>django.core.exceptions.ImproperlyConfigured:EmployeeAdmin.list_display[1], 'name' 不是可调用的或在模型 'Employee' 中找到的 'EmployeeAdmin' 的属性.
from django.db 导入模型从 django.contrib 导入管理员类员工(模型.模型):lastname = models.CharField("Last", max_length=64)firstname = models.CharField("First", max_length=64)middlename = models.CharField("Middle", max_length=64)clocknumber = models.CharField(max_length=16)@财产定义名称(自己):返回 ''.join([self.lastname,' ,', self.firstname, ' ', self.middlename])元类:ordering = ['姓氏','名字','中间名']类员工管理(admin.ModelAdmin):list_display = ('clocknumber','name')fieldsets = [("姓名", {"字段":(("姓氏", "名字", "中间名"), "clocknumber")}),]admin.site.register(员工,员工管理员)
好的... Daniel Roseman 的回答似乎应该有效.与往常一样,您会在发布问题后找到您要找的内容.
从 Django 1.5 文档我发现这个例子开箱即用.感谢大家的帮助.
这是有效的代码:
from django.db 导入模型从 django.contrib 导入管理员类员工(模型.模型):lastname = models.CharField("Last", max_length=64)firstname = models.CharField(第一个", max_length=64)Middlename = models.CharField(Middle", max_length=64)clocknumber = models.CharField(max_length=16)def _get_full_name(self):返回此人的全名."return '%s, %s %s' % (self.lastname, self.firstname, self.middlename)full_name = 属性(_get_full_name)元类:ordering = ['姓氏','名字','中间名']类员工管理(admin.ModelAdmin):list_display = ('clocknumber','full_name')fieldsets = [(Name", {fields":((lastname", firstname", middlename"), clocknumber")}),]admin.site.register(员工,员工管理员)
I have a simple Employee
model that includes firstname
, lastname
and middlename
fields.
On the admin side and likely elsewhere, I would like to display that as:
lastname, firstname middlename
To me the logical place to do this is in the model by creating a calculated field as such:
from django.db import models
from django.contrib import admin
class Employee(models.Model):
lastname = models.CharField("Last", max_length=64)
firstname = models.CharField("First", max_length=64)
middlename = models.CharField("Middle", max_length=64)
clocknumber = models.CharField(max_length=16)
name = ''.join(
[lastname.value_to_string(),
',',
firstname.value_to_string(),
' ',
middlename.value_to_string()])
class Meta:
ordering = ['lastname','firstname', 'middlename']
class EmployeeAdmin(admin.ModelAdmin):
list_display = ('clocknumber','name')
fieldsets = [("Name", {"fields":(("lastname", "firstname", "middlename"), "clocknumber")}),
]
admin.site.register(Employee, EmployeeAdmin)
Ultimately what I think I need is to get the value of the name fields as strings. The error I am getting is value_to_string() takes exactly 2 arguments (1 given)
. Value to string wants self, obj
. I am not sure what obj
means.
There must be an easy way to do this, I am sure I am not the first to want to do this.
Edit: Below is my code modified to Daniel's answer. The error I get is:
django.core.exceptions.ImproperlyConfigured: EmployeeAdmin.list_display[1], 'name' is not a callable or an attribute of 'EmployeeAdmin' of found in the model 'Employee'.
from django.db import models
from django.contrib import admin
class Employee(models.Model):
lastname = models.CharField("Last", max_length=64)
firstname = models.CharField("First", max_length=64)
middlename = models.CharField("Middle", max_length=64)
clocknumber = models.CharField(max_length=16)
@property
def name(self):
return ''.join(
[self.lastname,' ,', self.firstname, ' ', self.middlename])
class Meta:
ordering = ['lastname','firstname', 'middlename']
class EmployeeAdmin(admin.ModelAdmin):
list_display = ('clocknumber','name')
fieldsets = [("Name", {"fields":(("lastname", "firstname", "middlename"), "clocknumber")}),
]
admin.site.register(Employee, EmployeeAdmin)
Ok... Daniel Roseman's answer seemed like it should have worked. As is always the case, you find what you're looking for after you post the question.
From the Django 1.5 docs I found this example that worked right out of the box. Thanks to all for your help.
Here is the code that worked:
from django.db import models
from django.contrib import admin
class Employee(models.Model):
lastname = models.CharField("Last", max_length=64)
firstname = models.CharField("First", max_length=64)
middlename = models.CharField("Middle", max_length=64)
clocknumber = models.CharField(max_length=16)
def _get_full_name(self):
"Returns the person's full name."
return '%s, %s %s' % (self.lastname, self.firstname, self.middlename)
full_name = property(_get_full_name)
class Meta:
ordering = ['lastname','firstname', 'middlename']
class EmployeeAdmin(admin.ModelAdmin):
list_display = ('clocknumber','full_name')
fieldsets = [("Name", {"fields":(("lastname", "firstname", "middlename"), "clocknumber")}),
]
admin.site.register(Employee, EmployeeAdmin)
这篇关于如何将计算字段添加到 Django 模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!