在添加多对多关系上使用Model.save()吗?

时间:2019-05-04 08:34:07

标签: django

我正在尝试创建自定义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(),因此会为密码创建一些非唯一值(我不知道为什么?)。有没有一种方法可以通过调用.save()来建立m2m关系,还是这个问题全错了?

0 个答案:

没有答案