我最近在django中浏览了RESTful API并遇到了Tastypie。我遇到了以下问题。
- 如果我们使用水合物或hydrate_FOO,我们还会使用obj_create吗?如果是这样,在哪种情况下我们使用obj_create更好?什么是用于,任何简单的场景解释?
- 使用水合物时,我的理解是,当我们只收到POST / Update / Patch请求时,我们使用水合物,在bundle.data中传输数据以设置正确的bundle.obj.Field。我们将使用水合物的任何其他情况?
- 如果我们已经有了hydrate_FOO,那么采用全水合物和水合物的方法是什么意思?前两个必须或更好地使用的任何具体例子?
- 请考虑以下示例:
醇>
来自客户的数据:
{
"A": "abc",
"B": "lifeisgood"
}
模型文件:
class A(models.Model):
Astr = models.CharField(max_length=30)
class B(models.Model):
Bstr = models.CharField(max_length=30)
class C(models.Model):
a = models.ForeignKey(A)
b = models.ManyToManyField(B)
data = models.DateTime(auto_now=True)
资源文件是:
class CResource(ModelResource):
a = fields.ToOneField(AResource, "iamA")
b = fields.ToManyField(BResource, "iamB")
如果我从客户端获取数据并且它是POST,我目前正在做的是:
内部CResource:
def hydrate_a(self, bundle):
bundle.obj.a = A.objects.get(Astr = bundle.data['A'])
return bundle
def hydrate_b(self, bundle):
bundle.obj.b = B.objects.filter(Bstr = bundle.data['B'])
return bundle
然而,我得到的结果是:
- A资源进入数据库,B资源(ManyToMany)没有。
- 它给了我错误:
{
“错误信息”: ””,
“traceback”:“Traceback(最近一次调用最后一次):\ n \ n File \”/ opt / local / Library / Frameworks / Python.framework / Versions / 2.6 / lib / python2.6 / site-packages / django_tastypie-0.10 .0-py2.6.egg / tastypie / resources.py \“,第195行,在包装器中\ n response = callback(request,* args,** kwargs)\ n \ n File \”/ opt / local / Library /Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django_tastypie-0.10.0-py2.6.egg/tastypie/resources.py \“,第426行,在dispatch_list \ n中返回self .dispatch('list',request,** kwargs)\ n \ n File \“/ opt / local / Library / Frameworks / Python.framework / Versions / 2.6 / lib / python2.6 / site-packages / django_tastypie-0.10 .0-py2.6.egg / tastypie / resources.py \“,第458行,在dispatch \ n response = method(request,** kwargs)\ n \ n File \”/ opt / local / Library / Frameworks / Python.framework / Versions / 2.6 / lib / python2.6 / site-packages / django_tastypie-0.10.0-py2.6.egg / tastypie / resources.py \“,第1320行,在post_list \ n updated_bundle = self.obj_create (bundle,** self.remove_api_resource_names( kwargs))\ n \ n文件\“/ opt / local / Library / Frameworks / Python.framework / Versions / 2.6 / lib / python2.6 / site-packages / django_tastypie-0.10.0-py2.6.egg / tastypie /resources.py \“,第2084行,在obj_create \ n中返回self.save(包)\ n \ n文件\”/ opt / local / Library / Frameworks / Python.framework / Versions / 2.6 / lib / python2.6 /site-packages/django_tastypie-0.10.0-py2.6.egg/tastypie/resources.py \“,第2235行,在save \ n self.save_m2m(m2m_bundle)\ n \ n文件\”/ opt / local / Library / Frameworks / Python.framework / Versions / 2.6 / lib / python2.6 / site-packages / django_tastypie-0.10.0-py2.6.egg / tastypie / resources.py \“,第2326行,在save_m2m \ n related_mngr中= getattr(bundle.obj,field_object.attribute)\ n \ n文件\“/ opt / local / Library / Frameworks / Python.framework / Versions / 2.6 / lib / python2.6 / site-packages / django / db / models /fields/related.py \“,第279行,在获取 \ n引发self.related.model.DoesNotExist \ n \ nDoesNotExist \ n”
}
醇>
知道为什么这不正确吗?根据前端给出的数据,在POST时保存外键或多个相关数据的建议方法是什么?
非常感谢!
-leo