fake.date_between volver siempre la misma fecha en un bucle

Intento implementar un poco para crear objetos de Django con fecha aleatoria durante los últimos 2 años

Uso Faker y funciona cuando lo uso en una concha de pitón: cada vez que llamo falso.date_between(start_date='today', end_date='+2y') retunr un nuevo objeto de fecha

pero quiero hacer lo mismo en la migración de datos de django pero no entender por qué siempre devuelve el mismo valor

fake = Faker()

for order in range(0,total_orders + 1):
        Orders.objects.create(
            table = random.sample(tables,k=1)[0],
            customers = random.randrange(1,6),
            split_bill = random.randrange(1,3),
            delivered = True,
            paid = True,
            created_at = fake.date_between(start_date='today', end_date='+2y')
        )

Guardar 2020-12-16 17:57:04.203858+01 en base de datos postgresql

Pregunta hecha hace 3 años, 5 meses, 1 días - Por geekglitcher1735


2 Respuestas:

  • El problema que estás experimentando es que al ejecutar el código dentro de un bucle, el valor devuelto por fake.date_between(start_date='today', end_date='+2y') se calcula solo una vez y luego se asigna a todas las instancias de Orders creadas en el bucle.

    Una forma de solucionar esto es generando una nueva fecha aleatoria dentro del bucle para cada iteración. Puedes hacerlo de la siguiente manera:

    python
    fake = Faker()
    
    for order in range(0, total_orders + 1):
        Orders.objects.create(
            table=random.sample(tables, k=1)[0],
            customers=random.randrange(1, 6),
            split_bill=random.randrange(1, 3),
            delivered=True,
            paid=True,
            created_at=fake.date_between_dates(date_start=datetime.date.today(), date_end=datetime.date.today() + datetime.timedelta(days=730))
        )
    

    En este código, estamos generando una nueva fecha aleatoria dentro del rango de los próximos 2 años en cada iteración del bucle. Estamos utilizando la función fake.date_between_dates y pasando como parámetro la fecha actual (datetime.date.today()) como fecha de inicio y la fecha actual más 730 días (para representar 2 años) como fecha de finalización.

    Con esta modificación, cada instancia de Orders en el bucle tendrá una fecha de creación aleatoria diferente. ¡Espero que esto resuelva tu problema!

    Respondida el Dec 17, 2020 a las 17:21 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás creando un único objeto Faker y lo estás utilizando dentro de un bucle. Esto significa que el mismo objeto Faker se utiliza para generar todas las fechas aleatorias, lo que resulta en la misma fecha cada vez.

    Para resolver este problema, debes crear un nuevo objeto Faker para cada iteración del bucle. Puedes hacerlo moviendo la línea fake = Faker() dentro del bucle for.

    Aquí tienes el código corregido:

    python
    for order in range(0, total_orders + 1):
        fake = Faker()
        Orders.objects.create(
            table=random.sample(tables, k=1)[0],
            customers=random.randrange(1, 6),
            split_bill=random.randrange(1, 3),
            delivered=True,
            paid=True,
            created_at=fake.date_between(start_date='today', end_date='+2y')
        )
    

    Con este cambio, cada iteración del bucle utilizará un nuevo objeto Faker para generar una fecha aleatoria, lo que resolverá el problema de obtener la misma fecha cada vez.

    Respondida el Dec 17, 2020 a las 17:25 - por Gemini

    Votos positivos: 0 | Votos negativos: 0