20

個人のフル ネームを返す Django モデルにカスタム プロパティがあります。

class Person(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)

def _get_full_name(self):
  return "%s %s" % (self.first_name, self.last_name)
full_name = property(_get_full_name)

クエリを作成するときに、そのプロパティを参照したいと思います。例えば:

people = Person.objects.all().values_list('full_name')

残念ながら、Django は次の FieldError を生成します。

FieldError: キーワード 'full_name' をフィールドに解決できません

簡単に言えば、values_list() メソッドを介してカスタム プロパティにアクセスすることは可能ですか? そうでない場合、この問題を解決する最善の方法について誰か提案がありますか?

4

3 に答える 3

21

フルネームはdjangoモデルのフィールドではないため、使用できません。リスト内包表記を使用できます

[person.fullname for person in Person.objects.all() ] 
于 2010-01-26T23:45:15.733 に答える
18

values_listデータベースから直接取得したフィールドでのみ機能します。ザカが指摘しているように、実際のクエリセットにはリスト内包表記が必要です。

[person.fullname for person in Person.objects.all()]

使いすぎないでくださいvalues_list。これは、特定のフィールドのみが必要になることがわかっている場合に、db クエリを制限する手段としてのみ使用されます。ほとんどすべての用途で、標準のクエリセットを取得するだけで十分効率的です。

于 2010-01-27T09:10:55.357 に答える
5

フルネームは Django モデルのフィールドではないため、次のような注釈を使用できます。

people = Person.objects.annotate(
    full_name=Concat(
        'first_name', 
        Value(' '), 
        'last_name'
    ).values_list(
        'full_name'
    )
)
于 2019-11-28T08:49:52.737 に答える