Mam model Employees
i chciałbym mieć zestaw QuerySet zawierający wszystkie wiersze, ale z określonymi polami z każdego wiersza, a nie ze wszystkimi polami.
Wiem, jak sprawdzać wszystkie wiersze z tabeli / modelu:
Employees.objects.all()
Chciałbym wiedzieć, jak wybrać pola dla każdego elementu Queryset. Jak mogę to zrobić?
python
django
django-models
zentenk
źródło
źródło
SELECT col
zamiastSELECT *
?Odpowiedzi:
Employees.objects.values_list('eng_name', flat=True)
To tworzy płaską listę wszystkich
eng_name
s. Jeśli chcesz mieć więcej niż jedno pole w wierszu, nie możesz utworzyć płaskiej listy: spowoduje to utworzenie listy krotek:Employees.objects.values_list('eng_name', 'rank')
źródło
Oprócz tego,
values_list
jak Daniel wspomina , możesz również użyćonly
(lubdefer
dla odwrotnego efektu), aby uzyskać zestaw zapytań obiektów mających tylko swój identyfikator i określone pola:Employees.objects.only('eng_name')
Spowoduje to uruchomienie pojedynczego zapytania:
SELECT id, eng_name FROM employees
źródło
Możemy wybrać wymagane pola nad wartościami.
Employee.objects.all().values('eng_name','rank')
źródło
var_name = Employee.objects.all().values('eng_name','rank')
for person in var_name: print(person['eng_name'] + " " + person['rank'])
Odpowiedź Oskara Perssona jest najlepszym sposobem na poradzenie sobie z tym, ponieważ ułatwia przekazywanie danych do kontekstu i normalne traktowanie ich z szablonu, gdy otrzymujemy instancje obiektów (łatwo iterowalne w celu uzyskania właściwości) zamiast zwykłej listy wartości.
Następnie możesz łatwo zdobyć poszukiwany rekwizyt:
for employee in employees: print(employee.eng_name)
Lub w szablonie:
{% for employee in employees %} <p>{{ employee.eng_name }}</p> {% endfor %}
źródło
Możesz użyć value_list obok filtra w ten sposób;
active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)
Więcej szczegółów tutaj
źródło
Odpowiedź Daniela jest na miejscu. Jeśli chcesz zapytać o więcej niż jedno pole, wykonaj następujące czynności:
Employee.objects.values_list('eng_name','rank')
Spowoduje to wyświetlenie listy krotek. Nie możesz użyć named = Ture podczas odpytywania więcej niż jednego pola.
Co więcej, jeśli wiesz, że istnieje tylko jedno pole z tą informacją i znasz identyfikator pk, zrób to:
Employee.objects.values_list('eng_name','rank').get(pk=1)
źródło