Django ORM - обновление указанного экземпляра c с помощью user-ForeignKey - PullRequest
0 голосов
/ 30 марта 2020

У меня есть следующие настройки модели:

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 () метод ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...