我有一个简单的Employee模型,其中包括firstname, lastname和middlename领域.
在管理员方面,可能在其他地方,我想将其显示为:
lastname, firstname middlename
Run Code Online (Sandbox Code Playgroud)
对我来说,这样做的合理位置是在模型中通过创建一个计算字段:
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)
Run Code Online (Sandbox Code Playgroud)
最终我认为我需要的是将名称字段的值作为字符串.我得到的错误是value_to_string() takes exactly 2 arguments (1 given).字符串想要的值self, obj …
在django视图中,我需要将字符串数据附加到数据库中现有文本列的末尾.因此,例如,假设我有一个名为"ATable"的表,并且它有一个名为"aField"的字段.我希望能够以无竞赛条件的方式将字符串附加到"aField"的末尾.最初,我有这个:
tableEntry = ATable.objects.get(id=100)
tableEntry.aField += aStringVar
tableEntry.save()
Run Code Online (Sandbox Code Playgroud)
问题在于,如果同时执行此操作,两者都可以获得相同的"tableEntry",则它们各自独立更新,最后一个"保存"获胜,丢失另一个附加的数据.
我对此进行了一些研究,并使用F表达式找到了这个,我希望它可以工作:
ATable.objects.filter(id=100).update(aField=F('aField') + aStringVar)
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我得到一个SQL错误,说:
operator does not exist: text + unknown
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
尝试更改为"str(aStringVar)",即使它已经是一个字符串 - 没有运气..我发现一些django错误报告抱怨类似的问题,但我没有看到修复或解决方法.有没有什么方法可以转换aStringVar,以便它可以附加到F表达式的文本?BTW - 也试过"str(F('aField'))+ aStringVar"但是将F表达式的结果转换为字符串"(DEFAULT :)".