Я пытаюсь создать пользовательские файлы миграции Django, чтобы заранее заполнить базу данных во время разработки Проблема в том, что я заполняю некоторые значения модели методом Model.save (). См. models.py :
class Model1(models.Model):
name = models.CharField('kitchen name', max_length=150, blank=False, unique=True)
related_users = models.ManyToManyField(User, related_name='kitchens', blank=True)
secret_code = models.CharField('kitchen code', max_length=9, blank=True, unique=True)
def save(self, *args, **kwargs):
if not self.secret_code:
self.secret_code = self.generate_random_code()
super(Kitchen, self).save(*args, **kwargs)
def generate_random_code(self, chars=string.ascii_uppercase + string.digits):
"""
creates a string out of 6 random characters
"""
code_digit_num = 9
return ''.join(random.choice(chars) for _ in range(code_digit_num))
Однако в моем файле миграции я пытаюсь добавить некоторых пользователей в поле related_users, которое возвращает ошибку.
django.db.utils.IntegrityError: двойное значение ключа нарушает уникальное
ограничение "customer_exemple_secret_code_key" ДЕТАЛИ: Ключ
(secret_code) = () уже существует.
Функция добавления данных выглядит следующим образом:
def add_example_data(apps, shema_editor):
Model1 = apps.get_model("customer", "Model1")
Customer = apps.get_model("customer", "Customer")
User = apps.get_model("user", "User")
for example_dict in DATA:
k = Model1.objects.create(
name=example_dict["name"],)
related_customer=Customer.objects.get(name=example_dict["related_customer"])
)
for related_user_instance in example_dict["related_user"]:
u = User.objects.get(email=related_user_instance)
k.related_users.add(u)
Я думаю, проблема в том, что метод .add
использует метод .bulk_create
, который не вызовет .save()
в модели и, следовательно, создает не уникальное значение для секретного кода (я не знаю, почему ?). Можно ли создать отношения m2m, позвонив по номеру .save()
или у меня возникла эта проблема?