Как остановить функцию Django от получения повторяющихся результатов?

#python #django #list #algorithm #django-models

Вопрос:

У меня возникли проблемы с этой функцией, которая создает дубликаты записей. У меня есть пара страниц с документами, которые содержат ответ в document виде списка записей. Каждая страница содержит другой номер в этом списке. Когда все записи создаются в базе данных, она начинает дублировать их, потому что количество страниц превышает количество страниц, на которых есть документы.

Вот как выглядит ответ для каждой страницы:

 {
    "page": 3,
    "limit": 10,
    "count": 2,
    "machines": [
        {
            "1234",
            "location": "123 Random address",
            "location_name": "Scraton",
            "location_coordinates": {
                "latitude": 54.443454,
                "longitude": -124.9137471
            },
        {
            "document_id": "1235",
            "location": "124 Random address",
            "location_name": "New York",
            "location_coordinates": {
                "latitude": 233.385037,
                "longitude": -40.1823481
            },
       ]
}
 

Вот функция, которая создает дубликаты.

 def sync_all_documents(limit=1000, page_start=0,page_end=10):
  for page in range(page_start, page_end):
    try:
      response_data = get_documents(limit=limit, page=page)
      logger.info(f"Page Count: {response_data['count']}")

      if(response_data['count'] == 0):
        return

    except RequestError as ex:
      return # loop short circuits here 

    try:
      documents = response_data[“documents”]
      for document in documents:
        # STEP 1 - Location

        try:
          serialized_location = serialize_location_information(document)

          location, l_created = Location.objects.get_or_create(
            latitude=serialized_location["latitude"],
            longitude=serialized_location["longitude"],
            defaults={
              "country": serialized_location["country"],
              "state": serialized_location["state"],
              "city": serialized_location["city"],
              "street_address": serialized_location["street_address"],

              "postal_code": serialized_location["postal_code"],
              "name": serialized_location["name"],
              "status": serialized_location["status"],
            }
          )

          if l_created:
        except Exception as ex:
          location = None
          pass

        # STEP 2 - Document
        try:
          serialized_document = serialize_document_information(document)
          
          document, m_created = Document.objects.update_or_create(
            atm_id=serialized_document[“document_id"],
            defaults={
              "provider": serialized_document[“provider"],
              "status": serialized_document[“status"],
              "location": location,
            }
          )
          if m_created:
            logger.info(f"New Document was created successfully")
        except Exception as ex:
          logger.error("Could not update/create Document)
          pass # continue looping

    except Exception as ex:
      logger.error(“Document does not exist")
      return # loop short circuits here 

  return "sync completed"