単一フィールドを選択するdjangoモデル


102

私はというテーブル/モデルを持っています Employeesあり、単一フィールドのすべての行をクエリセットとして取得したいと思います。

私はこのようにそれを行うことができることを知っています(私がこれを正しくやっているといいのですが):

emp_list = Employees.objects.get(all)
emp_names = emp_list.eng_name

データベースにすべてのフィールドを照会し、1つだけを使用しますか?これを行うためのより良い(より速い)方法はありますか?


「1つだけを使用する」とはどういう意味ですか??のSELECT col代わりに SELECT *
CiroSantilli郝海东冠事病六四事件法轮功2016年

回答:


184
Employees.objects.values_list('eng_name', flat=True)

これにより、すべてeng_nameのフラットリストが作成されます。行ごとに複数のフィールドが必要な場合、フラットリストを作成することはできません。これにより、タプルのリストが作成されます。

Employees.objects.values_list('eng_name', 'rank')

回答ありがとうございます。1つ以上のフィールド(すべてではない)のみを選択したい場合はどうすればよいですか?
zentenk 2011

申し訳ありませんが、質問がわかりません。
ダニエルローズマン2011

3
ドキュメントを共有してください。それは他の人に役立ちます
bob marti 2017

25

加えvalues_list、ダニエルが 言及あなたも使用することができますonly(またはdefer唯一の自分のIDと指定されたフィールドを持つオブジェクトのクエリセットを取得するために逆の効果のために):

Employees.objects.only('eng_name')

これにより、単一のクエリが実行されます。

SELECT id, eng_name FROM employees

3
このコマンドは、Djangoバージョン2.1.3とPythonバージョン3.6.2のすべてのフィールドを返します。
アナンティ

このファイルのみをフェッチしますが、他のフィールドにアクセスしようとすると、別のデータベースクエリが実行されます。したがって、これは優れた最適化手法ですが、これらの余分なクエリを作成しないようにしてください。そうしないと、パフォーマンスが向上するのではなく、パフォーマンスが低下します。
Eerik Sven Puudist

6

値よりも必須フィールドを選択できます。

Employee.objects.all().values('eng_name','rank')

クエリが正常に実行された後、フィールドの値を変数に格納する方法。var_name = <query_name>。<field_name>
user12379095

@ user12379095このように単純に:var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan

@ user12379095してから、このVAR_NAMEを使用するために-例えば:すべての従業員の名前とランクを印刷し、あなたがこれを行うことができます:for person in var_name: print(person['eng_name'] + " " + person['rank'])
theQuestionMan

3

Oskar Perssonの答えは、データをコンテキストに渡し、単純な値リストではなくオブジェクトインスタンス(小道具を取得するのが簡単)を取得するときにテンプレートから通常どおりに処理するのが簡単になるため、それを処理するための最良の方法です。

その後、必要な小道具を簡単に入手できます。

for employee in employees:
    print(employee.eng_name)

またはテンプレート内:

{% for employee in employees %}

    <p>{{ employee.eng_name }}</p>

{% endfor %}

1

このように、filters_listをフィルターと一緒に使用できます。

active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)

詳細はこちら

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.