So fügen Sie einem Django-Modell ein berechnetes Feld hinzu

Ich habe eine einfacheEmployee Modell, das enthältfirstname, lastname undmiddlename Felder.

Auf der Admin-Seite und wahrscheinlich auch anderswo möchte ich Folgendes anzeigen:

lastname, firstname middlename

Für mich ist der logische Ort, dies zu tun, im Modell, indem ein berechnetes Feld als solches erstellt wird:

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)

Letztendlich denke ich, dass ich den Wert der Namensfelder als Zeichenfolgen erhalten muss. Der Fehler, den ich erhalte, istvalue_to_string() takes exactly 2 arguments (1 given). Wert zum Zeichenkette wünschtself, obj. Ich bin mir nicht sicher wasobj meint.

Es muss einen einfachen Weg geben, ich bin mir sicher, dass ich nicht der erste bin, der dies tun möchte.

Bearbeiten: Dies ist mein Code, der an Daniels Antwort angepasst wurde. Der Fehler, den ich erhalte, ist:

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)

Antworten auf die Frage(5)

Ihre Antwort auf die Frage