Django IntegrityError: UNIQUE constraint failed: pu_limity.zakazka_id
Я получаю следующую ошибку, когда пытаюсь импортировать файл csv и сохранить данные в базе данных:
IntegrityError at /limity/limity_csv_import
UNIQUE constraint failed: pu_limity.zakazka_id
models.py
class Limity(models.Model):
zakazka = models.ForeignKey(Zakazky, on_delete=models.CASCADE)
p_el = models.DecimalField("E/L", decimal_places=2, max_digits=4, null=True, blank=True)
p_ml = models.DecimalField("M/L", max_digits=6, decimal_places=4, null=True, blank=True)
p_prispevek = models.DecimalField("Příspěvek", max_digits=10, decimal_places=2, null=True, blank=True)
p_pu = models.DecimalField("PU", max_digits=10, decimal_places=2, null=True, blank=True)
aktualizace = models.DateTimeField(auto_now=True, null=True)
@classmethod
def create_from_csv_line(cls, line):
l = Limity()
try:
l.zakazka = Zakazky.objects.get(kod=line["Zakazka"])
except Zakazky.DoesNotExist:
print(line["Zakazka"])
l.zakazka, _ = Zakazky.objects.get_or_create(kod=line["Zakazka"])
except:
print(line["Zakazka"])
l.p_el = line["EL"]
l.p_ml = line["ML"]
l.p_prispevek = line["Prispevek"]
l.p_pu = line["PU"]
l.save()
views.py
class LimityCSVImportView(LoginRequiredMixin, SuccessMessageMixin, FormView):
template_name = "limity/limity_csv_import.html"
form_class = LimityCSVForm
def test_func(self):
return self.request.user.is_superuser
def post(self, request, *args, **kwargs):
form: LimityCSVForm = LimityCSVForm(request.POST, request.FILES)
if form.is_valid():
csv_file = form.cleaned_data["uploaded_file"]
decoded_file = csv_file.read().decode('utf-8-sig')
io_string = io.StringIO(decoded_file)
reader = csv.DictReader(io_string, delimiter=",", skipinitialspace=True)
record_count = 0
for line in reader:
Limity.create_from_csv_line(line=line)
record_count += 1
context = self.get_context_data()
my_text = ' nových limitů vloženo.'
messages.success(request, str(record_count) + my_text)
return render(request, self.template_name, context)
else:
return self.form_invalid(form)
Ошибка возникает при сохранении данных из формы в строке l.save()
Я нашел несколько ответов на эту ошибку и попробовал в @classmethod:
el = (line["EL"])
if not el:
l.p_el = 0
else:
l.p_el = el
Но затем я получаю другую ошибку:
ValidationError at /limity/limity_csv_import
['“” value must be a decimal number.']
И я не получаю эту ошибку, так как все значения в csv-файле являются числами:
Есть идеи, что я должен сделать, чтобы включить этот импорт данных? Я также кое-что забыл о локализации, я привык к английским форматам, но для этого приложения я использую локализацию cs-cz, так что если проблема в этом, что мне с этим делать?