我使用Django 1.11,在models.py中输入以下代码。它在makemigrations时可以正常工作,但它在迁移时会注意到“models.DoesNotExist”的错误。django models.DoesNotExist:匹配查询不存在
在models.py代码:
class RecordType(models.Model):
name = models.CharField(max_length=100, default='out',blank=True, verbose_name="name")
def get_record_type_default():
return RecordType.objects.get_or_create(pk=1)[0].id
class PrimaryCategory(models.Model):
type = models.ForeignKey(RecordType, on_delete=models.PROTECT, default=get_record_type_default, verbose_name="type")
def get_primary_category_default():
return PrimaryCategory.objects.get_or_create(pk=1)[0].id
class SecondaryCategory(models.Model):
primary_category = models.ForeignKey(PrimaryCategory, on_delete=models.PROTECT, default=get_primary_category_default, verbose_name="1st category")
def get_secondary_category_default():
return SecondaryCategory.objects.get_or_create(pk=1)[0].id
class Record(models.Model):
secondary_category = models.ForeignKey(SecondaryCategory, on_delete=models.PROTECT, default=get_secondary_category_default, verbose_name="2nd category")
这里是错误信息,而这样做迁移:
File "C:\Users\myname\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py", line 464, in get_or_create
return self.get(**lookup), False
File "C:\Users\myname\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py", line 380, in get
self.model._meta.object_name
datacore.models.DoesNotExist: SecondaryCategory matching query does not exist.
具有外键的默认功能是有问题的。迁移是在数据库事务中完成的,相关模型也可能处于不稳定状态。 'get_or_create'不会像通常那样工作。首先创建一个外键可以为NULL的迁移,然后使用另一个迁移使其不可空,然后使用该默认函数,可以实现这一目标。您还可以考虑手动调整迁移脚本以更改迁移步骤的顺序。 –
感谢您的建议。我认为get_or_create函数应该有一些错误。我尝试了几次,并且发现如果我先从Record类中删除secondary_category属性来执行迁移,然后将其添加回来并再次迁移,则代码将起作用。 – f1ynns5
我也怀疑get_or_create的嵌套调用深度是有限的,因为如果我删除了Record类,代码也可以工作。 – f1ynns5