Como posso recuperar o último registro de um determinado queryset?
Respostas:
EDIT: agora você tem que usar Entry.objects.latest('pub_date')
Você poderia simplesmente fazer algo assim, usando reverse()
:
queryset.reverse()[0]
Além disso, tome cuidado com este aviso da documentação do Django:
... note que
reverse()
geralmente só deve ser chamado em um QuerySet que tem uma ordem definida (por exemplo, ao consultar um modelo que define uma ordem padrão, ou ao usarorder_by()
). Se nenhuma ordem for definida para um dadoQuerySet
, chamáreverse()
-lo não tem efeito real (a ordem era indefinida antes da chamadareverse()
e permanecerá indefinida depois).
latest(field_name=None)
retorna o objeto mais recente na tabela, por data, usando o field_name fornecido como o campo de data.Este exemplo retorna a última entrada na tabela, de acordo com o
pub_date
campo:
Entry.objects.latest('pub_date')
A maneira mais simples de fazer isso é:
books.objects.all().last()
Você também pode usar isso para obter a primeira entrada, como:
books.objects.all().first()
books.objects.last()
e books.objects.first()
deve fazer o truque.
XYZ.objects.first()
e XYZ.objects.last()
Django> = 1,6
Adicionados os métodos QuerySet first () e last (), que são métodos de conveniência que retornam o primeiro ou o último objeto correspondente aos filtros. Retorna Nenhum se não houver nenhum objeto correspondente.
Para obter o primeiro objeto:
ModelName.objects.first()
Para obter os últimos objetos:
ModelName.objects.last()
Você pode usar o filtro
ModelName.objects.filter(name='simple').first()
Isso funciona para mim.
Quando o queryset já estiver esgotado, você pode fazer isso para evitar outra dica de banco de dados -
last = queryset[len(queryset) - 1] if queryset else None
Não use try...except...
.
Django não joga IndexError
neste caso.
Ele lança AssertionError
ou ProgrammingError
(quando você executa o python com a opção -O)
Se estiver usando django 1.6 e superior, é muito mais fácil agora, pois a nova API foi introduzida -
Model.object.earliest()
Ele dará o último () com direção reversa.
ps - Eu sei que é uma questão antiga, estou postando como se fosse pra frente alguém pousar nessa questão, eles ficam conhecendo esse novo recurso e não acabam usando o método antigo.
Você pode usar Model.objects.last()
ou Model.objects.first()
. Se não ordering
for definido, o queryset é ordenado com base na chave primária. Se você deseja ordenar o comportamento do queryset, então você pode se referir aos dois últimos pontos.
Se você está pensando em fazer isso, Model.objects.all().last()
recuperar o último e Model.objects.all().first()
recuperar o primeiro elemento em um queryset ou usar filters
sem pensar duas vezes. Então veja algumas advertências abaixo.
A parte importante a observar aqui é que se você não incluiu nenhum ordering
em seu modelo, os dados podem estar em qualquer ordem e você terá um último ou primeiro elemento aleatório que não era esperado.
Por exemplo. Digamos que você tenha um modelo chamado Model1
com 2 colunas id
e item_count
10 linhas com id 1 a 10. [Não há ordenação definida]
Se você buscar Model.objects.all (). Last () assim, poderá obter qualquer elemento da lista de 10 elementos. Sim, é aleatório, pois não há ordenação padrão.
Então, o que pode ser feito?
ordering
base em qualquer campo ou campos em seu modelo. Ele também tem problemas de desempenho, verifique isso também. Ref: aquiorder_by
enquanto busca. Como isso:Model.objects.order_by('item_count').last()
A maneira mais simples, sem ter que se preocupar com a ordem atual, é converter o QuerySet em uma lista para que você possa usar a indexação negativa normal do Python. Igual a:
list(User.objects.all())[-1]