由于序列化程序中 QuerySet 的评估,迁移不能 运行?
Migrations can't run due to evaluation of QuerySet in Serializer?
试图解决这个先有鸡还是先有蛋的问题。我已经定义了一个新模型,现有模型外键进入该模型,并进行了新迁移,包括为新模型提供一些默认值的数据迁移。
在现有模型的序列化器中,我想像这样定义一个默认值:
new_thing = serializers.PrimaryKeyRelatedField(
queryset=NewThing.objects.all(),
default=NewThing.objects.get(id=DEFAULT_NEW_THING_ID),
)
我不明白 django 的具体机制,但这似乎会在 运行 迁移时引起问题(尽管 makemigrations 看起来不错)。似乎迁移 运行 对视图进行了一系列应用程序检查,并最终检查了序列化程序,它在其中评估 NewThing QuerySet 和 returns 一个错误,表明 NewThing 的关系不存在(因为迁移还没有还没 运行。
您永远不应该 运行 在 class 级定义中进行实际查询;这通常在 Django 和 DRF 中都是如此。 get
是一个查询,将在定义时访问数据库,尽管 queryset
参数不会并且可以。
如果你想设置一个基于实际对象的默认值,你应该在创建时通过定义 create()
方法来实现,你可以在该方法中检查是否没有提供该值。
试图解决这个先有鸡还是先有蛋的问题。我已经定义了一个新模型,现有模型外键进入该模型,并进行了新迁移,包括为新模型提供一些默认值的数据迁移。
在现有模型的序列化器中,我想像这样定义一个默认值:
new_thing = serializers.PrimaryKeyRelatedField(
queryset=NewThing.objects.all(),
default=NewThing.objects.get(id=DEFAULT_NEW_THING_ID),
)
我不明白 django 的具体机制,但这似乎会在 运行 迁移时引起问题(尽管 makemigrations 看起来不错)。似乎迁移 运行 对视图进行了一系列应用程序检查,并最终检查了序列化程序,它在其中评估 NewThing QuerySet 和 returns 一个错误,表明 NewThing 的关系不存在(因为迁移还没有还没 运行。
您永远不应该 运行 在 class 级定义中进行实际查询;这通常在 Django 和 DRF 中都是如此。 get
是一个查询,将在定义时访问数据库,尽管 queryset
参数不会并且可以。
如果你想设置一个基于实际对象的默认值,你应该在创建时通过定义 create()
方法来实现,你可以在该方法中检查是否没有提供该值。