Django - Primeiros último objeto criado, filtros simultâneos
-
12-09-2019 - |
Pergunta
Desculpas, eu sou completamente novo para Django e Python.
Eu tenho 2 perguntas. Primeiro, como eu iria sobre como obter o último objeto criado (ou mais alto pk) em uma lista de objetos? Por exemplo, eu sei que eu poderia usar o seguinte para obter o primeiro objeto:
list = List.objects.all()[0]
Existe uma maneira para obter o comprimento de List.objects? Eu tentei List.objects.length mas sem sucesso.
Em segundo lugar, é possível criar filtros simultâneos ou combinar listas? Aqui está um exemplo:
def findNumber(request, number)
phone_list = Numbers.objects.filter(cell=number)
Eu quero algo como o acima, mas mais como:
def findNumber(request, number)
phone_list = Numbers.objects.filter(cell=number or home_phone=number)
O que é a sintaxe correta, se houver?
Solução
Eu não tentei isso ainda, mas eu olhar para o mais recente () operador em QuerySets :
mais recente (field_name = None)
Retorna o objeto mais recente na mesa, por data, usando o field_name fornecido como o campo de data.
Este exemplo retorna a última entrada na tabela, de acordo com o campo pub_date:
Entry.objects.latest ( 'pub_date')
Se especifica Meta do seu modelo get_latest_by, você pode deixar de fora a argumento field_name a mais recente (). Django usará o campo especificado no get_latest_by por padrão.
Como get (), mais recente () raises DoesNotExist se um objeto não existir com os parâmetros dados.
Nota latest () existe puramente para conveniência e legibilidade.
E os docs modelo no get_latest_by :
get_latest_by
Options.get_latest_by
O nome de um DateField ou DateTimeField no modelo. Isso especifica o campo padrão para usar em mais recente método o seu modelo de Manager.
Exemplo:
get_latest_by = "order_date"
Veja a documentação para latest () para mais.
Edit:. Wade tem uma boa resposta sobre Q () operador
Outras dicas
Este obras!
Model.objects.latest('field')
- campo pode ser id. que será o último id
Para a maior chave primária, tente o seguinte:
List.objects.order_by('-pk')[0]
Note que o uso de pk
funciona independentemente do nome real do campo definido como chave primária.
Desde Django 1.6 - última
last()
Funciona como first()
, mas retorna o último objeto na queryset.
Retorna o último objeto acompanhado pelo queryset ou None
se não houver nenhum objeto correspondente. Se o QuerySet não tem nenhuma ordenação definida, então o queryset é automaticamente ordenadas pela chave primária.
list = List.objects.last()
lhe dá o último objeto criado
Você pode usar o método count () em uma consulta definir a obter o número de itens.
list = List.objects.all()
list.count()
Argumentos para filtro são "AND". Se você precisa fazer ou filtros de olhar para objetos Q. http: //docs.djangoproject .com / en / dev / temas / db / consultas / # complexo pesquisas-com-q-objetos
alternativa para o último objeto criado:
List.objects.all()[List.objects.count()-1]
É necessário adicionar um AssertionError para o caso quando não há itens na lista.
except AssertionError:
...
Eu estou trabalhando na versão Django é 1.4.22, nem last
nem lastet
está funcionando.
Minha maneira de resolver com carga mínima db é semelhante:
latest = lambda model_objects, field : model_objects.values_list( field, flat = True ).order_by( "-" + field )[ 0 ]
latest_pk = latest( List.objects, "pk" )
Esta função aceita query_set como entrada.
Você pode ligar esta função dinamicamente fazendo:
import types
List.objects.latest = types.MethodType( latest, List.objects )
Em seguida, você deve ser capaz de obter o último objeto por esta última pk facilmente.