как получить первый элемент и последний элемент с помощью django, Location.objects.all () - PullRequest
15 голосов
/ 05 марта 2011

это мой код.

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}}

но это ничего не показывает,

что я могу сделать,

спасибо

Ответы [ 6 ]

26 голосов
/ 05 марта 2011

Посмотрите на http://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets

Отрицательное индексирование (т.е. Entry.objects.all()[-1]) не поддерживается.

Попробуйте:

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 голосов
/ 07 ноября 2013

Чтобы получить последний [-1], попробуйте Location.objects.latest('id'), как показано в документации:

https://docs.djangoproject.com/en/1.3/ref/models/querysets/#latest

3 голосов
/ 05 марта 2011

Возможно, вам не удастся отрицательно проиндексировать набор запросов, но вы можете поместить этот набор запросов в список и затем индексировать его.

locations = list(Location.objects.all())
first_element = locations[0]
last_element = locations[-1]

Это ужасно неэффективно, и его следует использовать только в том случае, еслив вашей таблице небольшое количество мест, и вы хотите, чтобы код был простым.В противном случае, если есть реальная необходимость сделать это эффективным, см. Ответ @ pterk, включающий агрегаты и Мин. / Макс.

1 голос
/ 20 июня 2017

В случае, если кто-то пришел сюда для получения первого и последнего элемента связанной модели - единственный способ сделать это эффективно - превратить связанное поле в список или использовать 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]
1 голос
/ 05 марта 2011

Последний: - Location.objects.reverse()[0]

ИЛИ

          Location.objects.all()[Location.objects.count()-1]  // BAD WAY

Первый: Location.objects.all()[0]

Примечание: Отрицательное индексирование не поддерживается.поэтому Location.objects.all()[-1] выдаст вам AssertionError

0 голосов
/ 05 марта 2011

Если у вас есть способ сортировки объектов местоположения, посмотрите на Агрегаты (Мин. И Макс.). http://docs.djangoproject.com/en/dev/topics/db/aggregation/

Возможно, вы захотите выполнить Min и Max на id, но старайтесь избегать этого, поскольку порядок идентификаторов не гарантируется (по крайней мере, не для разных механизмов баз данных)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...