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 ...
4 réponses
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()
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'])
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
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.
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.