0

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

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

来自客户端的数据:

{
    "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. 它给了我错误:{“error_message”:“”,“traceback”:“Traceback(最近一次调用最后一次):\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\",第 195 行,在包装器中\n response = callback(request, *args, **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\",第 426 行,在 dispatch_list\n return 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 文件\"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django_tastypie-0.10.0-py2.6.egg/ sweetpie/resources.py\",第 1320 行,在 post_list\n updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(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\",第 2084 行,在 obj_create\n 中返回 self.save(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\",第 2235 行,保存中\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 时,从前端给出的数据中保存外键或多对多相关数据的建议方法是什么。

非常感谢!-狮子座

4

0 回答 0