2017-08-30 317 views
1

我使用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. 
+0

具有外键的默认功能是有问题的。迁移是在数据库事务中完成的,相关模型也可能处于不稳定状态。 'get_or_create'不会像通常那样工作。首先创建一个外键可以为NULL的迁移,然后使用另一个迁移使其不可空,然后使用该默认函数,可以实现这一目标。您还可以考虑手动调整迁移脚本以更改迁移步骤的顺序。 –

+0

感谢您的建议。我认为get_or_create函数应该有一些错误。我尝试了几次,并且发现如果我先从Record类中删除secondary_category属性来执行迁移,然后将其添加回来并再次迁移,则代码将起作用。 – f1ynns5

+0

我也怀疑get_or_create的嵌套调用深度是有限的,因为如果我删除了Record类,代码也可以工作。 – f1ynns5

回答

-2

你可以用下面的方法来创建对象:

get_object_or_404(RecordType, pk=id) 
+0

如果你的意思是**“object”**的数据库记录,那么它肯定是错误的。 'get_object_or_404'不会在数据库中创建记录。 – ohannes

+0

get_object_or_404用于http响应,但与迁移无关。 –