为模型查询集生成随机时间

2024-05-18 08:44:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在20小时内生成随机时间,然后将其分配给24小时的所有查询集

以下是我的看法:

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)
    number = qs.count()
    lst = []
    for _ in range(number):
        for t in [fake.date_time_between(start_date='-20h', end_date='now')]:
            lst.append(t)
    for i in lst:
        print(i) # this work fin until now <==
        x = 0
        while x < len(lst): 
            time = i[x+1]
            if qs.exists():
                for item in qs:
                    item.pud_date_rotation = time
                    item.save() 

TypeError:“datetime.datetime”对象不可订阅


Tags: infromimportfordatetimedatetimeitem
3条回答

发生此错误的原因是您试图访问datetime对象:

time = i[x+1]

但是datetime对象的list在代码中被称为lst。也许你是说

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

例如,我建议重命名变量,以便在读取它们时看到它们是什么。此外,没有停止条件(将永远运行)。我建议如下:

while x < len(lst):
    time = lst[x+1]
    ... your other code ...
    x += 1

在这段代码中

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

您放置了time = i[x+1],但i是一个日期时间对象而不是列表,因此没有索引。这是导致错误的原因

我想你是想把time = lst[x+1]

给你

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

旁注:您的while循环将永远运行,因为在它的任何地方都不会增加x的值。您的代码可能需要一些重构

这里有几件事不对

首先,导致错误的是:idatetime而不是列表或任何其他可下标类型。这就是i[x+1]抛出错误的原因

第二,如果您试图迭代queryset中的所有项,并给每个项一个随机时间,为什么不直接迭代queryset呢

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()           

如果要同时发布所有帖子,只需计算循环之前的时间,如下所示:

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()

相关问题 更多 >