Django - Mise en dernier objet créé, filtres simultanés
-
12-09-2019 - |
Question
Toutes mes excuses, je suis tout à fait nouveau à Django et Python.
J'ai 2 questions. Tout d'abord, comment pourrais-je obtenir le dernier objet créé (ou le plus 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]
Y at-il un moyen 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 combiner des listes? Voici un exemple:
def findNumber(request, number)
phone_list = Numbers.objects.filter(cell=number)
Je veux quelque chose comme ce qui précède, 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?
La solution
Je ne l'ai pas encore essayé, mais je regarderais le QuerySets :
dernier (field_name = None)
Renvoie le dernier objet dans la table, par date, en utilisant le field_name à condition que le champ de date.
Cet exemple renvoie la dernière entrée dans le tableau, en fonction de la champ pub_date:
Entry.objects.latest ( 'pub_date')
Si les Meta spécifie votre modèle get_latest_by, vous pouvez laisser tomber le l'argument field_name à la dernière (). Django utilisera le champ spécifié dans get_latest_by par défaut.
Comme get (), le dernier () soulève DoesNotExist si un objet ne exister avec les paramètres donnés.
Notez existe dernier () uniquement pour la commodité et la lisibilité.
Et le modèle de rel="noreferrer"> :
get_latest_by
Options.get_latest_by
Le nom d'un DateField ou DateTimeField dans le modèle. Indique le champ par défaut à utiliser dans le dernier méthode de votre modèle Manager.
Exemple:
get_latest_by = "order_date"
Voir la documentation pour le dernier () pour plus.
Edit:. Wade a une bonne réponse de l'opérateur Q ()
Autres conseils
cela fonctionne!
Model.objects.latest('field')
- champ peut être id. ce sera le dernier id
Pour la plus grande clé primaire, essayez ceci:
List.objects.order_by('-pk')[0]
Notez que l'utilisation pk
fonctionne quel que soit le nom réel du champ défini comme clé primaire.
Depuis Django 1.6 - dernière
last()
fonctionne comme first()
, mais retourne le dernier objet dans le queryset.
Retourne le dernier objet abondés par l'queryset ou None
s'il n'y a pas d'objet correspondant. Si le QuerySet n'a pas de commande défini, le queryset est automatiquement commandé par la clé primaire.
list = List.objects.last()
vous donne le dernier objet créé
Vous pouvez utiliser la méthode count () sur une requête réglez l'option Obtenir le nombre d'éléments.
list = List.objects.all()
list.count()
Les arguments de filtre sont "ET" ed ensemble. Si vous devez faire ou les filtres regarder les objets Q. http: //docs.djangoproject .com / fr / dev / sujets / db / requêtes / # complexes avec-lookups q-objets
alternative pour le dernier objet créé:
List.objects.all()[List.objects.count()-1]
Il est nécessaire d'ajouter un AssertionError pour le cas où il n'y a aucun élément dans la liste.
except AssertionError:
...
Je travaille sur la version Django est 1.4.22, ni last
, ni lastet
travaille.
Ma façon de résoudre avec une charge minimale db est comme:
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 comme entrée.
Vous pouvez lier cette fonction dynamique en faisant:
import types
List.objects.latest = types.MethodType( latest, List.objects )
Ensuite, vous devriez être en mesure d'obtenir le dernier objet par ce dernier pk facilement.