我正在尝试创建自定义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关系,还是这个问题全错了?