J'essaie de générer un temps aléatoire entre 20 heures d'affilée et maintenant, et de l'attribuer à une passe de tous les jeux de requêtes 24H. voici ce que je fais: de faker import Faker fake = Faker () de blogs.models import Post ...

0
Lifechess 17 mars 2021 à 02:09

4 réponses

Meilleure réponse

Il y a plusieurs problèmes ici.

Premièrement, celui qui cause l'erreur: i est un datetime pas une liste ou tout autre type d'indice. C'est pourquoi i[x+1] renvoie une erreur.

Deuxièmement, si vous essayez d'itérer tous les éléments de l'ensemble de requêtes et de leur donner à chacun une heure aléatoire, pourquoi ne pas simplement parcourir l'ensemble de requêtes?

from faker import Faker
fake = Faker()
from blogs.models import Post
from django.utils import timezone
import datetime

def rotate_time():
    now = timezone.now()
    day_pass = now - datetime.timedelta(hours=24)
    qs = Post.objects.filter(created__lt=day_pass)

    for post in qs:
        post.pud_date_rotation = fake.date_time_between(start_date='-20h', end_date='now')
        post.save()           

Si vous voulez donner à tous les messages la même heure, calculez simplement le temps avant la boucle comme ceci:

def rotate_time():
    now = timezone.now()
    day_pass = now - datetime.timedelta(hours=24)
    qs = Post.objects.filter(created__lt=day_pass)
    
    time = fake.date_time_between(start_date='-20h', end_date='now')
    for post in qs:
        post.pud_date_rotation = time
        post.save()
2
SMoenig 16 mars 2021 à 23:56

Je ne sais pas pourquoi je fais même des minces depuis que la question a été répondue, mais quand même ...

from datetime import timedelta
from itertools import islice

from blogs.models import Post
from django.utils import timezone
from faker import Faker


fake = Faker()

def rotate_time():
    now = timezone.now()
    day_pass = now - timedelta(hours=24)
    
    qs = Post.objects.filter(created__lt=day_pass).iterator()
    while True:
        posts = list(islice(qs, 2000))
        if not posts:
            break
        for post in posts:
            post.pud_date_rotation = fake.date_time_between(start_date='-20h', end_date='now')
        Post.objects.bulk_update(posts, ['pud_date_rotation'])
0
Raccoon Clever 16 mars 2021 à 23:57

L'erreur se produit car vous essayez d'accéder à un objet datetime:

time = i[x+1]

Mais le list des objets datetime est appelé lst dans votre code. Peut-être que tu voulais dire

while x < len(lst):
    time = lst[x+1]

Je suggère de renommer les variables afin que vous voyiez ce qu'elles sont lorsque vous les lisez datetimes_list par exemple. Il n'y a pas non plus de condition d'arrêt (fonctionnera pour toujours). Je suggère quelque chose comme:

while x < len(lst):
    time = lst[x+1]
    ... your other code ...
    x += 1
0
xtlc 16 mars 2021 à 23:30

Dans cette section de code

for i in lst:
        print(i) # this work fin until now <==
        x = 0
        while x < len(lst): 
            time = i[x+1]

Vous mettez time = i[x+1] mais i est un objet datetime pas une liste donc n'est pas indexé. Ceci est à l'origine de l'erreur.

Je pense que vous vouliez mettre time = lst[x+1].

Te donner

for i in lst:
        print(i) # this work fin until now <==
        x = 0
        while x < len(lst): 
            time = lst[x+1]

Remarque: votre boucle while fonctionnera indéfiniment car vous n'incrémentez la valeur de x nulle part à l'intérieur. Votre code peut nécessiter une refactorisation.

0
Danoram 16 mars 2021 à 23:25