Используйте Model.save () при добавлении отношений «многие ко многим»? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь создать пользовательские файлы миграции 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() или у меня возникла эта проблема?

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