Обработка длинных задач по созданию обновлений в django

У меня есть задача по созданию маршрутов. Маршрут может быть объектом с origin, destination, type. Origin и Destination - это просто FK из Location ojbect.

Представьте, что у меня есть 3 локации, a, b, c. с тремя типами, X, Y, Z. Тогда возможные маршруты таковы.

routes = [(a,b,x), (a,c,x), (b,a,x), (b,c,x), (c,a,x), (c,b,x) , (a,b,y), (a,c,y), (b,a, y), (b,c,y), (c,a,y), (c,b,y) , (a,b,z), (a,c,z), (b,a,z), (b,c,z), (c,a,z), (c,b,z) ]

Теперь я могу создавать маршруты с тем же результатом. но проблема в том, что у меня будет более 43 тысяч уникальных мест, по оценкам это будет около 5.5B уникальных маршрутов, основанных на 3 типах. Поэтому я хотел бы иметь другой тип подхода, где я могу возобновить процесс, если что-то не получается. У нас нет проблем, если это займет несколько дней, но будет проблема, если мы начнем это с нуля, если что-то не получится.

Так что любая идея или концепция будет оценена по достоинству. Мы используем приложение Django для работы с этим. Вот реальные модели и код. Я планирую использовать эту функцию create_route в фоновом режиме с помощью celery и redis.

class Route(models.Model):
    origin = models.ForeignKey(
        Location, related_name="route_origin", on_delete=models.CASCADE
    )
    destination = models.ForeignKey(
        Location, related_name="route_destination", on_delete=models.CASCADE
    )

    # Type options
    VAN, REEFER, FLATBED = "V", "R", "F"

    equipment_type = models.CharField(
        max_length=50,
        choices=(
            (VAN, "Van"),
            (REEFER, "Reefer"),
            (FLATBED, "Flatbed"),
        ),
    )



class Location(models.Model):
    zip_code = models.CharField(max_length=5)


def create_routes():
    locations = Location.objects.all()
        equipment_types = [Route.VAN, Route.REEFER, Route.FLATBED]
        for origin, destination in permutations(locations, 2):
            for equipment_type in equipment_types:
                Route.objects.create(
                    origin=origin,
                    destination=destination,
                    equipment_type=equipment_type,
                )

Вернуться на верх