2011-03-05 34 views
11

este es mi código.cómo obtener el primer elemento y el último elemento usando django, Location.objects.all()

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

entonces,

return render_to_response(template_name, { 
     'first_element':first_element, 
     'last_element':last_element, 
    }) 

y en la plantilla:

{{ first_element.terminal_id}} {{last_element.terminal_id}} 

pero no muestran nada,

qué puedo hacer,

gracias

+0

first_element debería mostrar al menos algo si la indexación negativa es el problema, ¿en qué medida ha depurado esto? – gladysbixly

+0

Si ha encontrado una solución, actualice y cierre esta pregunta. – zsquare

Respuesta

19

Tenga una mirada en http://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets

indexación negativo (es decir, Entry.objects.all()[-1]) no es compatible.

Probar:

first_element = Location.objects.all()[0] 
last_element = Location.objects.all().reverse()[0] 

- Actualización de 08/06/17 -

Basado en comentarios @MisterRios',

A partir de 1,6 Django admite el uso de .first() y en .last() querysets: first_element = Location.objects.first() last_element = Location.objects.last()

Refer: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.first

+0

A partir de 1.6, Django admite el uso de '.first()' y '.last()' en los conjuntos de consulta: 'first_element = Location.objects.first()' 'last_element = Location.objects.last()' Ver: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.first – MisterRios

+0

¡Gracias! Actualización de respuesta. – zsquare

0

Si tiene una forma de ordenar la ubicación de los objetos, busque en Agregados (Mín. Y Máx.). http://docs.djangoproject.com/en/dev/topics/db/aggregation/

Usted puede verse tentado a hacer mínimo y máximo en id pero trate de evitar que a medida que el orden de los identificadores no es garantizados (al menos no al otro lado de los motores de base de datos)

2

Es posible que no pueda aprovechar en forma negativa indexe un conjunto de interrogación, pero puede poner ese conjunto de consulta en una lista y luego indexar.

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

Esto es terriblemente ineficiente sin embargo, y sólo se debe utilizar si hay un pequeño número de lugares en su mesa, y se desea mantener el código simple. De lo contrario, si hay una necesidad genuina de hacerlo eficiente, consulte la respuesta de @ pterk, que involucra agregados y Min/Max.

1

Última: - Location.objects.reverse()[0]

O

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

Primero:Location.objects.all()[0]

Nota: indexación negativa no es compatible.así, Location.objects.all()[-1] le producirá una AssertionError

+2

-1 para personas engañosas - .all() [1] es * segundo * elemento, no el primero. –

+0

@Tomasz, gracias por la corrección .... Mi error :( – Tauquir

0

En caso de que alguien vino aquí para sacarle el primero y último elemento de una modelo relacionado: la única forma de hacerlo de manera eficiente es convertir el campo relacionado en una lista o usar count() para obtener el índice del último elemento (usando 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] 
Cuestiones relacionadas