Django, comment regrouper les modèles par date ?

voix
9

Disons que j'ai MyModeldes modèles avec ce genre de valeurs : Disons que j'ai des namechamps et des hascreated_at. created_atest DateTime.

Disons que j'ai des modèles avec ce genre de valeurs :

<id: 1, name: A, created_at: 04.06.2020T17:49>
<id: 2, name: B, created_at: 04.06.2020T18:49>
<id: 3, name: C, created_at: 05.06.2020T20:00>
<id: 4, name: D, created_at: 06.06.2020T19:20>
<id: 5, name: E, created_at: 06.06.2020T13:29>
<id: 6, name: F, created_at: 06.06.2020T12:55>

Je veux faire des requêtes qui me renverront ces modèles dans cet ordre :

[
    04.06.2020: [<id: 1, name: A, created_at: 04.06.2020T17:49>, <id: 2, name: B, created_at: 04.06.2020T18:49>],
    05.06.2020: [<id: 3, name: C, created_at: 05.06.2020T20:00>]
    06.06.2020: [<id: 4, name: D, created_at: 06.06.2020T19:20>, <id: 5, name: E, created_at: 06.06.2020T13:29>, <id: 6, name: F, created_at: 06.06.2020T12:55>]
]

Je veux regrouper tous les modèles par created_atchamp, mais en n'utilisant qu'une Datepartie du DateTimechamp. Je sais que je peux obtenir ce genre de résultat en utilisant simplement des boucles python, mais existe-t-il un moyen de résoudre ce problème avec l'ORM de Django ?

Créé 04/06/2020 à 13:54
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Vous pouvez essayer de suivre le code :

samples = MyModel.objects.all()
result = {}
for sample in samples:
    date_string = sample.created_at.strftime("%m.%d.%Y")
    if date_string in result:
        result[date_string].append(sample)
    else:
        result[date_string] = [sample]

Il renvoie la sortie comme suit :

{
'06.07.2020': [<Sample: MyModel object (1)>],
'05.07.2020': [<Sample: MyModel object (2)>, <Sample: MyModel object (3)>]
}

En gros, ce qu'il fait, c'est d'abord récupérer toutes les lignes et ensuite les regrouper au niveau python dans un dictionnaire.

Créé 08/06/2020 à 15:46
source utilisateur

voix
0

J'ai bien peur que cela ne soit pas tout à fait possible actuellement, du moins à ma connaissance (sans quelques modifications vraiment profondes au sein de l'ORM de Django).

Vous pouvez cependant effectuer des conversions et des agrégations de dates dans la base de données :

Cet exemple suppose que votre base de données supporte la fonction to_char.

qs = MyModel.objects.all()
qs.annotate(
  created_at_date=models.Func(
    models.F('created_at'),
    models.Value("'dd.MM.yyyy'"),
    function='to_char',
  )
).values('started_at_date').aggregate(
    # do required aggregations like Count or Sum
)

Créé 08/06/2020 à 15:50
source utilisateur

voix
0

Pas tout à fait compréhensible, mais si vous avez la base de données créée sous models.py, vous pouvez créer une méta-classe qui montre l'ordre

Class myModel(models.Model):
    #fields...

     Class Meta:
         ordering = ('-created_at')

Créé 04/06/2020 à 14:22
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more