У меня есть следующие настройки модели:
class Model1(models.Model):
val1_1 = models.CharField(max_length=25, blank=True)
val1_2 = models.CharField(max_length=25, blank=True)
user = models.ForeignKey('users.User', on_delete=models.PROTECT, related_name='model1')
class Model2(models.Model):
val2_1 = models.BinaryField()
model1_link = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='model2')
class Model3(models.Model):
id = models.BigAutoField(primary_key=True)
model2_link = models.ForeignKey(Model2, on_delete=models.CASCADE, related_name='model3')
val3_1 = models.CharField(max_length=50)
class Model4(models.Model):
id = models.BigAutoField(primary_key=True)
model3_link = models.ForeignKey(Model3, on_delete=models.CASCADE, related_name='model4', null=True, default=None)
pred = models.CharField(max_length=50)
# These fields are NOT FILLED IN during creation of an instance, and are instead updated later on with a separate query
disputed_on = models.DateTimeField(blank=True, null=True)
suggested_by = models.ForeignKey('users.User', on_delete=models.PROTECT, related_name='submitted_disputes', blank=True, null=True)
Время от времени я захочу получить доступ к экземпляру Speci c Model4, чтобы на самом деле заполнить значение в полях disputed_on & Sugges_by, обходя все путь от Model1. В настоящее время я делаю это следующим образом:
query = Model1.objects.filter(id=some_chosen_id).get().model2.last().model3.filter(val3_1=some_chosen_value).get().model4.last()
Результатом этого запроса является отдельный экземпляр модели, а не QuerySet. Затем я вычисляю новые значения, которые хочу вставить:
dispute_date = datetime.now(tz.tzutc())
if request.user.is_authenticated:
disputer = request.user
else:
# Assume admin (first entry)
disputer = User.objects.get(pk=1)
И сохраняю новые значения, выполняя следующие действия:
query.disputed_on = dispute_date
query.suggested_by = disputer
query.save()
Теперь происходит самое странное - мой postgres DB выдает ошибку, в которой говорится следующее:
postgres_1 | 2020-03-30 11:45:31.700 AEDT [4169] ERROR: duplicate key value violates unique constraint "users_user_username_key"
Теперь, способ, которым я его читаю, вызывая Forexit.save (), также приводит к тому, что БД пытается обновить таблицу пользователей. Но я не призываю к этому нигде в коде!
Есть идеи, почему это происходит?
Эта проблема, кажется, исчезла, когда я изменил свой запрос, чтобы остаться как QuerySet, и использую Вместо этого .update () метод ...