Проблема с Django CheckConstraintPython

Программы на Python
Ответить
Anonymous
 Проблема с Django CheckConstraint

Сообщение Anonymous »

Я пытаюсь добавить несколько новых полей в существующую модель, а также ограничение, связанное с этими новыми полями:
class User(models.Model):
username = models.CharField(max_length=32)

# New fields ##################################
has_garden = models.BooleanField(default=False)
garden_description = models.CharField(
max_length=32,
null=True,
blank=True,
)

class Meta:
constraints = [
models.CheckConstraint(
check=Q(has_garden=models.Value(True))
& Q(garden_description__isnull=True),
name="garden_description_if_has_garden",
)
]


Проблема в том, что при выполнении миграции я получаю следующую ошибку:
django.db.utils.IntegrityError: check constraint "garden_description_if_has_garden" is violated by some row

Но я не понимаю, как ограничение нарушается, если ни у одного пользователя нет has_garden, поле только создается, а его значение по умолчанию равно Ложь 🤔.
Я использую django 3.2 с postgresql.
Как правильно добавить это ограничение ? Если это будет полезно вот автоматически созданная миграция:
# Generated by Django 3.2.25 on 2025-01-15 23:52

import django.db.models.expressions
from django.db import migrations, models

class Migration(migrations.Migration):

dependencies = [
("some_app", "0066_user"),
]

operations = [
migrations.AddField(
model_name="user",
name="garden_description",
field=models.CharField(blank=True, max_length=32, null=True),
),
migrations.AddField(
model_name="user",
name="has_garden",
field=models.BooleanField(default=False),
),
migrations.AddConstraint(
model_name="user",
constraint=models.CheckConstraint(
check=models.Q(
("has_garden", django.db.models.expressions.Value(True)),
("garden_description__isnull", True),
),
name="garden_description_if_has_garden",
),
),
]


Подробнее здесь: https://stackoverflow.com/questions/793 ... constraint
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»