Как получить первый элемент и последний элемент, используя 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

Ответ 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]