18

モデルがPersonあり、djangoフォームを使用して、への外部キーを持つ別のオブジェクトを編集していますPerson。person モデルにはfirst_namelast_nameフィールドがあります。外部参照のドロップダウン ボックスの結果をフィルター処理するメソッドを実行したいと考えています。

values_list()次のようにフォーム フィールド オプション (choices プロパティ) をオーバーライドするために使用しようとしています。

data.form.fields['person'].choices = GetPersons().values_list('id', 'first_name')

GetPersons()Person クラスを次のようにフィルタリングするだけです

return Person.objects.filter(id__gt=1000)`

たとえば、表示したい人だけを取得します。辞書を返してすべてを手動で分割することなく、 andvalues_list()の連結を返すにはどうすればよいですか?first_namelast_name

4

3 に答える 3

23

私はあなたのために2つの提案を念頭に置いています:

  • 最初の 1 つは、データベース内のフィールドをextraで連結することです。私にとっては汚いソリューションですが、実行できます。

サンプル:

persons =  GetPersons().extra(select={'full_name': "concatenate( first, last) "} )
choices = persons.values_list('id', 'full_name')

と ...

  • 2 つ目はリスト内包表記を使用します。

サンプル:

choices = [ ( p.id, '{0} {1}'.format( p.first, p.last ),) for p in GetPersons() ]

2018年編集

Concatがデータベース関数として利用できるようになりました:

>>> from django.db.models import CharField, Value as V
>>> from django.db.models.functions import Concat
>>> persons = GetPersons().annotate(
...     full_name=Concat(
...         'last', V(', '), 'first', V('.'),
...         output_field=CharField()
...     )
... )
于 2012-07-10T16:34:04.243 に答える
0

Per: Django の QuerySet.values_list を使用してプロパティを参照することは可能ですか? 適用できない場合は values_list を避け、代わりに内包表記を使用します。

models.py:
class Person(models.Model):
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=64)
    def getPrintName(self):
        return self.last_name + ", " + self.first_name

views.py:
data.form.fields['person'].choices = [(person.id, person.getPrintName()) for person in GetPersons()]
于 2012-07-10T16:31:52.327 に答える