0

これらのモデルが与えられた場合:

class ModelA(models.Model):
    # Some fields
    # Some relationship

class ModelB(models.Model):
    # Some fields
    a = models.ForeignKey(ModelA)

およびこれらのおいしいパイのリソース:

class ResourceA(ModelResource):
    b_list = fields.ToManyField('app.api.ResourceB', 'a_set', null=True, related_name='a')

class ResourceB(ModelResource):
    a = fields.ToOneField(ResourceA, 'a', null=True)

ResourceB の詳細エンドポイント (/api/v1/resourceA/##/) にアクセスすると、関連する B のすべての URI が表示されます。逆の関係が機能します。返されるデータは次のようになります。

{
    'b_list': [
        '/api/v1/resourceB/1/',
        '/api/v1/resourceB/2/',
    ]
}

リソース A を PUT または PATCH して新しい B を追加しようとすると、次のデータを使用します。

{
    'b_list': [
        '/api/v1/resourceB/1/',
        '/api/v1/resourceB/2/',
        '/api/v1/resourceB/3/',
    ]
}

エラーが発生します:'ManyRelatedManager' object has no attribute 'add'このスタックトレースで:

Traceback (most recent call last):

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 202, in wrapper
    response = callback(request, *args, **kwargs)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 449, in dispatch_detail
    return self.dispatch('detail', request, **kwargs)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 472, in dispatch
    response = method(request, **kwargs)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 1611, in patch_detail
    self.update_in_place(request, bundle, deserialized)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 1634, in update_in_place
    return self.obj_update(bundle=original_bundle, **kwargs)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 2166, in obj_update
    return self.save(bundle, skip_errors=skip_errors)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 2257, in save
    self.save_m2m(m2m_bundle)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 2382, in save_m2m
    related_resource.save(updated_related_bundle)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 2257, in save
    self.save_m2m(m2m_bundle)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 2382, in save_m2m
    related_resource.save(updated_related_bundle)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 2257, in save
    self.save_m2m(m2m_bundle)

  File \"/home/username/.virtualenvs/myapp/local/lib/python2.7/site-packages/tastypie/resources.py\", line 2385, in save_m2m
    related_mngr.add(*related_objs)

AttributeError: 'ManyRelatedManager' object has no attribute 'add'

その後、すぐに同じデータを PUT/PATCH すると、エラーもスタックトレースも発生せず、アイテムがリレーションシップに正常に追加されます。なぜそうなのかわかりません。

また、関係に項目を追加することしかできないようです - それらを削除することもできれば素晴らしいことです. これについて別の質問をするかもしれません。

4

1 に答える 1

0

Ok。これは Django エラーです。よくわかりませんが、django モデルで related_name を使用してみてください。

class ModelB(models.Model):
# Some fields
a = models.ForeignKey(ModelA, related_name='b_list')

リソースから related_name を削除し、属性名を「a_set」から「b_list」に変更する必要があります

class ResourceA(ModelResource):
b_list = fields.ToManyField('app.api.ResourceB', 'b_list', null=True)
于 2013-06-13T04:29:55.523 に答える