Как получить первый элемент и последний элемент, используя django, Location.objects.all()
это мой код.
obj_list=Location.objects.all()
first_element=obj_list[0]
last_element=obj_list[-1]
то
return render_to_response(template_name, {
'first_element':first_element,
'last_element':last_element,
})
и в шаблоне:
{{ first_element.terminal_id}} {{last_element.terminal_id}}
но он ничего не показывает,
что я могу сделать,
спасибо
Ответы
Ответ 1
Посмотрите http://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets
Отрицательное индексирование (т.е. Entry.objects.all()[-1]
) не поддерживается.
Try:
first_element = Location.objects.all()[0]
last_element = Location.objects.all().reverse()[0]
- Обновление 8/6/17 -
Основываясь на комментарии @MisterRios,
Начиная с версии 1.6 Django поддерживает использование .first()
и .last()
в запросах:
first_element = Location.objects.first()
last_element = Location.objects.last()
Обратитесь: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.first
Ответ 2
Чтобы получить последний [-1]
попробуйте Location.objects.latest('id')
, как показано в документации:
https://docs.djangoproject.com/en/1.3/ref/models/querysets/#latest
Ответ 3
Возможно, вы не сможете отрицательно индексировать набор запросов, но вы можете поместить этот запрос в список, а затем индексировать.
locations = list(Location.objects.all())
first_element = locations[0]
last_element = locations[-1]
Это ужасно неэффективно, и его следует использовать только в том случае, если в вашей таблице есть небольшое количество мест, и вы хотите, чтобы код был прост. В противном случае, если есть настоящая необходимость сделать это эффективным, см. Ответ @pterk, включающий агрегаты и Min/Max.
Ответ 4
Последнее: - Location.objects.reverse()[0]
ИЛИ
Location.objects.all()[Location.objects.count()-1] // BAD WAY
Сначала: Location.objects.all()[0]
Примечание. Отрицательная индексация не поддерживается. поэтому Location.objects.all()[-1]
бросит вас
AssertionError
Ответ 5
Если у вас есть способ отсортировать объекты местоположения, посмотрите на Агрегаты (Мин. и Макс.). http://docs.djangoproject.com/en/dev/topics/db/aggregation/
У вас может возникнуть искушение сделать Min и Max на id
, но постарайтесь избежать этого, поскольку порядок идентификаторов не гарантируется (по крайней мере, не в разных механизмах базы данных)
Ответ 6
В случае, если кто-то пришел сюда для получения первого и последнего элемента связанной модели - единственный способ сделать это эффективно - включить связанное поле в список или использовать count(), чтобы получить индекс последнего элемента (используя Django 1.11.2 ):
class Parent(models.Model):
name = models.CharField(max_length=200)
class Child(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='children')
name = models.CharField(max_length=200)
class ParentTest(TestCase):
def test_parent(self):
# create some data
for p in range(10):
parent = Parent.objects.create(name=p)
for c in range(10):
parent.children.create(name=c)
with self.assertRaises(AssertionError): # can't negative index
parents = Parent.objects.prefetch_related('children')
for parent in parents:
first = parent.children.all()[0]
last = parent.children.all()[-1]
with self.assertNumQueries(22): # 2 for prefetch and 20 for access
parents = Parent.objects.prefetch_related('children')
for parent in parents:
first = parent.children.first()
last = parent.children.last()
with self.assertNumQueries(22): # 2 for prefetch and 20 for access
parents = list(Parent.objects.prefetch_related('children'))
for parent in parents:
first = parent.children.first()
last = parent.children.last()
with self.assertNumQueries(12): # 2 for prefetch and 10 for last
parents = Parent.objects.prefetch_related('children')
for parent in parents:
first = parent.children.all()[0]
last = parent.children.reverse()[0]
with self.assertRaises(AssertionError): # can't negative index
parents = list(Parent.objects.prefetch_related('children'))
for parent in parents:
first = parent.children.all()[0]
last = parent.children.all()[-1]
with self.assertNumQueries(2): # 2 for prefetch
parents = Parent.objects.prefetch_related('children')
for parent in parents:
children = list(parent.children.all())
first = children[0]
last = children[-1]
with self.assertNumQueries(2):
parents = Parent.objects.prefetch_related('children')
for parent in parents:
first = parent.children.all()[0]
last = parent.children.all()[parent.children.count() - 1]