Запрос на обновление элемента, созданный django, неверен
Я пытаюсь обновлять по одному элементу за раз, используя Django ORM с TimescaleDB в качестве базы данных.
У меня есть гипертаблица timesacle, определяемая следующей моделью:
class RecordTimeSeries(models.Model):
# NOTE: We have removed the primary key (unique constraint) manually, since we don't want an id column
timestamp = models.DateTimeField(primary_key=True)
location = PointField(srid=settings.SRID, null=True)
station = models.ForeignKey(Station, on_delete=models.CASCADE)
# This is a ForeignKey and not an OneToOneField because of [this](https://stackoverflow.com/questions/61205063/error-cannot-create-a-unique-index-without-the-column-date-time-used-in-part)
record = models.ForeignKey(Record, null=True, on_delete=models.CASCADE)
temperature_celsius = models.FloatField(null=True)
class Meta:
unique_together = (
"timestamp",
"station",
"record",
)
Когда я обновляю элемент, используя save()
:
record_time_series = models.RecordTimeSeries.objects.get(
record=record,
timestamp=record.timestamp,
station=record.station,
)
record_time_series.location=record.location
record_time_series.temperature_celsius=temperature_celsius
record_time_series.save()
Я получаю следующую ошибку:
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "5_69_db_recordtimeseries_timestamp_station_id_rec_0c66b9ab_uniq"
DETAIL: Key ("timestamp", station_id, record_id)=(2022-05-25 09:15:00+00, 2, 2) already exists.
и я вижу, что запрос, который использовал django, следующий:
{'sql': 'UPDATE "db_recordtimeseries" SET "location" = NULL, "station_id" = 2, "record_id" = 2, "temperature_celsius" = 26.0 WHERE "db_recordtimeseries"."timestamp" = \'2022-05-25T09:15:00\'::timestamp', 'time': '0.007'}
С другой стороны, обновление проходит успешно с update()
:
record_time_series = models.RecordTimeSeries.objects.filter(
record=record,
timestamp=record.timestamp,
station=record.station,
)
record_time_series.update(
location=record.location,
temperature_celsius=temperature_celsius,
)
а sql, используемый django, таков:
{'sql': 'UPDATE "db_recordtimeseries" SET "location" = NULL, "temperature_celsius" = 25.0 WHERE ("db_recordtimeseries"."record_id" = 2 AND "db_recordtimeseries"."station_id" = 2 AND "db_recordtimeseries"."timestamp" = \'2022-05-25T09:15:00\'::timestamp)', 'time': '0.012'}
Очевидно, что первый запрос неверен, потому что в нем нет правильных параметров в пункте WHERE
, но почему django не включает эти параметры, ведь timestamp не является уникальным ключом, и как это можно исправить?
Я думаю, что ошибка была вызвана из-за foregn_key
:
Первым:
< < <Аналогично ON DELETE существует также ON UPDATE, который вызывается, когда ссылающийся столбец изменяется (обновляется). Возможные действия такие же одинаковые. В данном случае, CASCADE означает, что обновленные значения должны быть скопированы в ссылающуюся строку(и).