1. ホーム
  2. python

Django のモデルに計算フィールドを追加する方法

2023-08-26 23:25:59

質問

私は、単純な Employee を含むモデルです。 firstname , lastnamemiddlename のフィールドがあります。

管理者側やおそらく他の場所でも、次のように表示したいと思います。

lastname, firstname middlename

これを行う論理的な場所は、このように計算フィールドを作成することによって、モデルの中にあります。

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)

最終的に私が必要と思うのは、nameフィールドの値を文字列として取得することです。 私が得ているエラーは value_to_string() takes exactly 2 arguments (1 given) . 文字列への値が欲しい self, obj . 私は obj の意味がわかりません。

これをする簡単な方法があるはずです、これをしたいと思うのはきっと私が初めてではないでしょう。

編集:以下は、Danielの答えに修正した私のコードです。 私が得たエラーは、次のとおりです。

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)

どのように解決するのですか?

ダニエル・ローズマンの回答は、うまくいくはずのものでした。いつもそうなのですが、探しているものを見つけると 質問を投稿した後 .

から Django 1.5 ドキュメント すぐに動作するこの例を見つけました。 助けてくれた皆さんに感謝します。

以下は、動作したコードです。

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)