web-dev-qa-db-fra.com

Django - Obtention du dernier objet créé, filtres simultanés

Toutes mes excuses, je suis complètement nouveau pour Django et Python.

J'ai 2 questions. Premièrement, comment pourrais-je obtenir le dernier objet créé (ou le plus grand pk) dans une liste d'objets? Par exemple, je sais que je pourrais utiliser ce qui suit pour obtenir le premier objet:

list = List.objects.all()[0]

Est-il possible d'obtenir la longueur de List.objects? J'ai essayé List.objects.length mais en vain.

Deuxièmement, est-il possible de créer des filtres simultanés ou de combiner des listes? Voici un exemple:

def findNumber(request, number)
    phone_list = Numbers.objects.filter(cell=number)

Je veux quelque chose comme ci-dessus, mais plus comme:

def findNumber(request, number)
    phone_list = Numbers.objects.filter(cell=number or home_phone=number)

Quelle est la syntaxe correcte, le cas échéant?

29
zdyn

Je n'ai pas encore essayé, mais je regarderais l'opérateur latest () operator on QuerySets :

last (nom_zone = Aucun)

Retourne le dernier objet dans le table, par date, en utilisant le nom_zone fourni comme champ de date.

Cet exemple renvoie la dernière entrée dans le tableau, selon le champ pub_date:

Entry.objects.latest ('pub_date')

Si la méta de votre modèle spécifie get_latest_by, vous pouvez laisser le argument nom_zone à last () . Django utilisera le champ spécifié dans get_latest_by par défaut.

Comme get (), latest () soulève DoesNotExist si un objet ne le fait pas existe avec les paramètres donnés.

Note latest () existe uniquement pour commodité et lisibilité.

Et le modèle docs sur get_latest_by :

get_latest_by

Options.get_latest_by

Nom d'un DateField ou DateTimeField dans le modèle. Ceci spécifie le champ par défaut à utiliser dans la dernière méthode de votre gestionnaire de modèles.

Exemple:

get_latest_by = "date_de_commande"

Voir la documentation pour last () pour plus.

Edit: Wade a une bonne réponse sur l’opérateur Q().

47
hughdbrown

cela marche!

Model.objects.latest('field') - le champ peut être id. ce sera le dernier identifiant

25
Harry

Pour la plus grande clé primaire, essayez ceci: 

List.objects.order_by('-pk')[0]

Notez que l'utilisation de pk fonctionne quel que soit le nom réel du champ défini comme clé primaire.

13
jcdyer

Vous pouvez utiliser la méthode count () sur une requête pour obtenir le nombre d'éléments.

list = List.objects.all()
list.count()

Les arguments à filtrer sont "ET" édités ensemble. Si vous avez besoin de filtres OR, examinez les objets Q . http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q- objets

3
Wade

alternative pour le dernier objet créé:

List.objects.all()[List.objects.count()-1]

Il est nécessaire d'ajouter une erreur AssertionError pour le cas où il n'y a aucun élément dans la liste.

except AssertionError:
   ...
0
RolandoAmir

Je travaille sur la version 1.4.22 de Django, ni last ni lastet ne fonctionne . Ma façon de résoudre avec un chargement de base de données minimal est la suivante:

latest = lambda model_objects, field : model_objects.values_list( field, flat = True ).order_by( "-" + field )[ 0 ]
latest_pk = latest( List.objects, "pk" )

Cette fonction accepte query_set en entrée.

Vous pouvez lier cette fonction dynamiquement en faisant:

import types
List.objects.latest = types.MethodType( latest, List.objects )

Ensuite, vous devriez pouvoir obtenir facilement le dernier objet de cette dernière version.

0
Sphynx-HenryAY