对Django Tastypie的理解

时间:2013-10-28 05:28:06

标签: python django tastypie

我最近在django中浏览了RESTful API并遇到了Tastypie。我遇到了以下问题。

  1. 如果我们使用水合物或hydrate_FOO,我们还会使用obj_create吗?如果是这样,在哪种情况下我们使用obj_create更好?什么是用于,任何简单的场景解释?
  2. 使用水合物时,我的理解是,当我们只收到POST / Update / Patch请求时,我们使用水合物,在bundle.data中传输数据以设置正确的bundle.obj.Field。我们将使用水合物的任何其他情况?
  3. 如果我们已经有了hydrate_FOO,那么采用全水合物和水合物的方法是什么意思?前两个必须或更好地使用的任何具体例子?
  4. 请考虑以下示例:
  5. 来自客户的

    数据:

    {
        "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
    

    然而,我得到的结果是:

    1. A资源进入数据库,B资源(ManyToMany)没有。
    2. 它给了我错误: { “错误信息”: ””, “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” }
    3. 知道为什么这不正确吗?根据前端给出的数据,在POST时保存外键或多个相关数据的建议方法是什么?

      非常感谢! -leo

0 个答案:

没有答案