【发布时间】:2017-05-22 05:04:14
【问题描述】:
我正在尝试快速保存一系列与外键相关的项目。保存父项后,我在创建子项时使用父项返回的 id。
这一次或两次有效,但在第二次或第三次时,我收到消息:
{"parent_id":["Invalid pk \"5063\" - object does not exist."]}
我已验证:
为创建相关项目而发送的 ID 实际上与保存父项目后在
done()中返回的 ID 相同如果我在创建子项之前添加延迟,我可以检查数据库并验证父项确实已创建并保存到数据库中
如果我在创建子项之前添加足够长的延迟(约 15 秒),则不会产生错误
由于 Backbone.js 前端似乎正在发送有效的 POST 请求,并且项目正在立即正确写入数据库,我认为这是一个 Django 问题。
Backbone.js 代码
var i = 0;
function createNew() {
var parent = ParentObjects.add({name: "New Parent Item"});
parent.save().done(function(var attributes, stuff, stuff) {
var id = attributes.id;
var child = ChildObjects.add({name: "New Child Item", parent_id: id});
child.save().done(function() {
i++;
if (i < 10) {
createNew();
}
});
});
}
Django Rest 框架代码
class Parent(Model):
name = models.CharField(max_length=200)
class Child(Model):
parent = models.ForeignKey(Parent, related_name="children")
name = models.CharField(max_length=200)
class ParentSerializer(ModelSerializer):
class Meta:
model = Parent
class ChildSerializer(ModelSerializer):
parent_id = serializers.PrimaryKeyRelatedField(
source='parent',
queryset=Parent.objects.all(),
)
class Meta:
model = Child
exclude = ('parent', )
class ChildViewSet(ModelViewSet):
queryset = Child.objects.all()
serializer_class = ChildSerializer
class ParentViewSet(ModelViewSet):
queryset = Parent.objects.all()
serializer_class = ParentSerializer
数据库是 Postgresql。
【问题讨论】:
标签: javascript python django backbone.js django-rest-framework