Неправильный ответ от функции .get_or_create в Django

Я пытался понять, почему не работает используемая мной функция .get_or_create. Предполагается, что она должна найти объект в БД с подходящими параметрами и создать новый, если таковых не найдено. При выполнении этой функции она всегда говорит, что нет подходящих объектов и кортеж каждый раз возвращает True, следовательно, всегда создается новый объект (дубликат).

Это приводит к тому, что оператор Except также будет выполняться каждый раз.

Вот моя функция:

for desktop in desktops:
        try:
          clean_location = serialized_location_information(desktop)
          clean_machine = serialize_machine_information(desktop)
          location_name, location_created = Location.objects.get_or_create(
            latitude=clean_location["latitude"],
            longitude=clean_location["longitude"],
            provider=clean_machine["provider"],
            defaults={
              "country": clean_location["country"],
              "state": clean_location["state"],
              "city": clean_location["city"],
              "street_address": clean_location["street_address"],
              "postal_code": clean_location["postal_code"],
              "name": clean_location["name"],
              "status": clean_location["status"],
            }
          )
          if l_created:
            logger.info(f"New Location was created successfully")
        except Exception as ex:
          logger.error(f"Could not get or create location: {ex}")
          location = None
          pass

Вот моя модель:

class Location(models.Model):
    class Meta:
        unique_together = ['latitude','longitude','provider']

    latitude = models.DecimalField(max_digits=9, decimal_places=6)
    longitude = models.DecimalField(max_digits=9, decimal_places=6)
    country = models.CharField(max_length=100, blank=True)
    state = models.CharField(max_length=25, blank=True)
    city = models.CharField(max_length=250, blank=True)
    street_address = models.CharField(max_length=250, blank=True)
    postal_code = models.CharField(max_length=100, blank=True)
    name = models.TextField(blank=True)
    status = models.PositiveSmallIntegerField(default=10, choices=LocationStatus.CHOICES)
    provider = models.ForeignKey(Provider, on_delete=models.CASCADE, default= '')
    
    def __str__(self):
        return f"{self.name}"

Вы можете сначала попытаться получить или создать объект provider, а затем искать объект Location, как показано ниже :-

for desktop in desktops:
        try:
          clean_location = serialized_location_information(desktop)
          clean_machine = serialize_machine_information(desktop)
          provider, _ = Provide.objects.get_or_create(provider_name = clean_machine["provider"])
          location_name, location_created = Location.objects.get_or_create(
            latitude=clean_location["latitude"],
            longitude=clean_location["longitude"],
            provider=provider,
            defaults={
              "country": clean_location["country"],
              "state": clean_location["state"],
              "city": clean_location["city"],
               ...
               ...
    
Вернуться на верх