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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top