Неправильный ответ от функции .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"],
...
...