J'ai une liste de personnes, chaque personne ayant une date de naissance, qui est stockée de manière prévisible dans un Je n'arrive pas à commander un Merci d'avance et laissez-moi savoir si la question a besoin de clarification. p> datefield code>. J'essaie de créer une liste de ces personnes - triées par le mois em> et jour em> de leur naissance (ignorant l'année) - avoir une sorte de "qui est l'anniversaire de qui est l'anniversaire à venir "Affichage. P>
QuerySet code> par la valeur DateTime.Month de la personne CODE>. Y a-t-il un moyen que cela puisse être fait sans avoir à recourir à la contrainte à une liste
() code>? P>
5 Réponses :
Vous pouvez utiliser queryset.extra () code>
pour définir un champ de mois et trier par celui-ci:
SomeModel.objects.extra(select={'birthmonth': 'MONTH(birthdate)'}, order_by=['birthmonth'])
Merci pour la réponse rapide! Je voulais juste clarifier pour ceux qui utilisent PostgreSQL pour remplacer mois (daté de naissance) code> avec
extrait (mois à partir de la date de naissance) code>.
Le nom de la méthode correct est extra
Autant que j'aime cette réponse, il apparaît que la méthode QuerySet.extra () est sur le bloc de découpage et sera éventuellement obsolète. L'État Django Docs, "Utilisez cette méthode en dernier recours" et "c'est une ancienne API que nous visons à se décompresser à un moment donné à l'avenir."
Les versions plus récentes de Django ont la recherche sur Datefields et DateTimefields. https://docs.djangoproject.com/fr/1.11 / ref / modèles / fonctions de base de données / extrait p>
myModel.ObjectS.order_by ('Anniversaire__month', 'Anniversaire__day') Code> P>
from django.db.models.functions import Extract from your_project.your_app.models import Person CHOICE_MONTH = ( (None, '--'), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 12), ) class PersonSearchForm(forms.Form): name = forms.CharField(label=u'name', required=False) month = forms.ChoiceField(label='month', choices=CHOICE_MONTH, required=False) def __init__(self, *args, **kwargs): self.corporation = kwargs.pop('corporation', None) super(PersonSearchForm, self).__init__(*args, **kwargs) def get_result_queryset(self): q = Q(corporation=self.corporation) if self.is_valid(): name = self.cleaned_data['name'] if name: q = q & Q(name__icontains=name) month = self.cleaned_data['month'] if month: q = q & Q(month=int(month)) return Person.objects.annotate(month=Extract('birthday', 'month'), day=Extract('birthday', 'day')).filter(q).order_by('month', 'day')
S'il vous plaît envisager d'ajouter une explication à votre réponse.
pour django> = 2.1 fort> p>
Vous pouvez trier le querySet en utilisant des noms de recherche de mois et de jour sur Datefield. P>
SomeModel.objects.extra(select={ 'birth_date_month': 'strftime("%m", birth_date)', 'birth_date_day': 'strftime("%d", birth_date)' }, order_by=['birth_date_month','birth_date_day'] )
post.Object.All (). order_by ('date_posted__minute'). Inverser () où date_posted est votre attribut que vous avez utilisé dans votre modèle de poste. p>
post est juste un exemple de modèle p> blockQuote>
Bonjour Janaki, merci d'avoir posté! Ajout de plus de détails à votre réponse et à l'aide de la terminologie qu'ils utilisent (mois de naissance / jour, plutôt que datte_posted), aidera l'affiche à comprendre votre réponse sans que vous puissiez demander des questions de suivi. Jetez un coup d'œil aux autres réponses à cette question pour avoir une idée de ce qui est nécessaire. Il aide également format de votre code .