Ограничение Django UNIQUE не работает с составным первичным ключом
Я искал похожие случаи, но они, похоже, не ставят под сомнение метод model.save(). Я новичок в Django и, следуя стандартной методологии, объявил класс, чтобы сопоставить его с ddbb (autoincremental id):
class Crudos(models.Model):
cuenta = models.CharField(verbose_name='Cuenta', max_length=100)
concepto = models.CharField(verbose_name='Concepto', max_length=100, default='indefinido')
magnitud = models.FloatField(verbose_name='Magnitud')
fecha = models.DateField(verbose_name='Fecha')
documento = models.FilePathField(verbose_name='Documento')
class Meta:
unique_together = ('cuenta', 'fecha',)
Представление, использующее этот класс, также заполняет таблицу:
for index, row in df.iterrows():
data = Crudos(cuenta=row.Cuenta, concepto=row.Concepto, magnitud=row.Magnitud, fecha=row.Fecha, documento=row.Documento)
data.save()
Фрейм данных генерируется из файла, и процесс работает без проблем в первый раз. Если я использую один и тот же файл дважды, то получаю сообщение об ошибке UNIQUE constrain failed. Models.save() должен быть обновлением, а не вставкой при попытке вставить регистр с той же уникальной комбинацией значений. Это происходит, когда первичный ключ включен в данные для сохранения. Проблема возникает, когда требуется составной первичный ключ, как в случае класса Crudo, что отражается в условии unique_together. Похоже, Django не в состоянии интерпретировать это условие как условие для выполнения обновления вместо вставки. Как способ обойти эту проблему, процесс работает следующим образом:
for i, row in df.iterrows():
register = Crudos.objects.get(cuenta=row.Cuenta, fecha=row.Fecha)
if register:
data = Crudos(id=register.id, cuenta=row.Cuenta, concepto=row.Concepto, magnitud=row.Magnitud, fecha=row.Fecha, documento=row.Documento)
data.save()
else:
data = Crudos(cuenta=row.Cuenta, concepto=row.Concepto, magnitud=row.Magnitud, fecha=row.Fecha, documento=row.Documento)
data.save()
Этот процесс заставляет выполнять запрос перед каждым сохранением, что значительно замедляет процесс. Есть ли какая-то другая более эффективная альтернатива? Есть ли лучший способ, позволяющий Django автоматически выполнять в качестве обновления ситуации, которые нарушают условие UNIQUE?
Спасибо