2016-09-22 29 views
0

我想外鍵添加到我的tastypie資源,不過在Django拋出這個錯誤:tastypie節約外鍵字段拋出異常

"error_message": "'BB' object is not iterable", 

我創建了一個最小的工作例如:

models.py

class AA(models.Model): 
    n = models.IntegerField() 


class BB(models.Model): 
    aa = models.ForeignKey(AA, related_name='xox') 
    t = models.CharField(max_length=2) 

resources.py

from ..models import AA, BB 

from tastypie.authorization import Authorization 
from tastypie.fields import ForeignKey 


class AResource(ModelResource): 
    class Meta: 
     queryset = AA.objects.all() 
     authorization = Authorization() 


class BBResource(ModelResource): 
    aa = ForeignKey(AResource, 'aa', related_name="xox", full=False, blank=True, null=True) 
    class Meta: 
     queryset = BB.objects.all() 
     authorization = Authorization() 

現在使用curl進行後動作:

$ curl -XPOST --dump-header - --header 'Content-Type: application/json' localhost:8000/api/v1/a/ --data '{"n": 18}' 
$ curl -XPOST --dump-header - --header 'Content-Type: application/json' localhost:8000/api/v1/bb/ --data '{"t": "di", "aa": "/api/v1/a/1/"}' 

回溯:

{ 
    "error_message": "'BB' object is not iterable", 
    "traceback": "Traceback (most recent call last):\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/tastypie/resources.py\", line 219, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/tastypie/resources.py\", line 450, in dispatch_list\n return self.dispatch('list', request, **kwargs)\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/tastypie/resources.py\", line 482, in dispatch\n response = method(request, **kwargs)\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/tastypie/resources.py\", line 1384, in post_list\n updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs))\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/tastypie/resources.py\", line 2175, in obj_create\n return self.save(bundle)\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/tastypie/resources.py\", line 2322, in save\n self.save_related(bundle)\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/tastypie/resources.py\", line 2382, in save_related\n setattr(related_obj, field_object.related_name, bundle.obj)\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/django/db/models/fields/related_descriptors.py\", line 481, in __set__\n manager.set(value)\n\n File \"/home/mee/.venvs/env_pro/lib/python2.7/site-packages/django/db/models/fields/related_descriptors.py\", line 639, in set\n objs = tuple(objs)\n\nTypeError: 'BB' object is not iterable\n" 
} 

包版本:

Django==1.9.7 
django-tastypie==0.13.3 

編輯

通過查詢BB的對象,我可以看到聯想被存儲

$ curl localhost:8000/api/v1/bb/ 
{ 
"meta": { 
    "limit": 20, 
    "next": null, 
    "offset": 0, 
    "previous": null, 
    "total_count": 1 
}, 
"objects": [ 
    { 
     "aa": "/api/v1/a/1/", 
     "id": 1, 
     "resource_uri": "/api/v1/bb/1/", 
     "t": "di" 
    } 
] 

而且通過檢查追蹤,誤差在Django的代碼提高。

任何建議將不勝感激。提前致謝。

回答

0

這是一個簡單的(和新手)問題,讓我感覺像一個似曾相識。這裏的問題是要記住何時使用related_name,在這種情況下該參數是沒有必要的。

Link to the docs其中解釋了related_name參數。