2016-03-10 2 views
0

Я знаю, что есть несколько сообщений по этой же проблеме, но решение можно найти в некоторой ошибке, сделанной в коде, который я не могу понять. Поэтому я публикую здесь то, что я написал до сих пор, надеясь на вашу помощь. У меня есть класс Node, и я получаю сообщение об ошибке, указанное в заголовке, когда я выполняю POST. Это мой код:Объект Django 'NoneType' не имеет атрибута 'obj'

class NodeResource(ModelResource): 

class Meta: 
    queryset = api.models.Node.objects.all() 
    resource_name = _Helpers.node_resource_name 
    always_return_data = True 

    # Allow retrieving large quantities of nodes at once. 
    limit = 250 
    max_limit = 0 

    filtering = {'name', 'is_ulg', 'latitude', 'longitude'} 
    allowed_methods = ['get', 'post'] 
    authentication = Authentication() 
    authorization = Authorization() 

def obj_create(self, bundle, **kwargs): 
    node = api.models.Node(name=bundle.data['name'], 
          is_ulg=bundle.data['is_ulg'], 
          latitude=bundle.data.get("latitude"), 
          longitude=bundle.data.get("longitude")) 
    node.save() 

Модель выглядит следующим образом:

class Node(models.Model): 
""" 
Represents a node in the graph. 
""" 
name = models.CharField(max_length=255) 
is_ulg = models.BooleanField(default=False, verbose_name='Is this node a member of the ULg?') 

latitude = models.FloatField() 
longitude = models.FloatField() 

def __str__(self): 
    return self.name 

class Meta: 
    ordering = ['name'] 
    unique_together = ("latitude", "longitude") 

Когда я выполняю пост со следующей JSON

{"name":"Node name","latitude": "2.4567", "longitude":"2.345", "is_ulg":false} 

Узел создан правильно, но я всегда получайте ошибку, указанную в названии. Полная ошибка заключается в следующем:

{"error_message":"'NoneType' object has no attribute 'obj'","traceback":"Traceback (most recent call last):\n\n File \"\/usr\/lib\/python2.7\/site-packages\/tastypie\/resources.py\", line 202, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"\/usr\/lib\/python2.7\/site-packages\/tastypie\/resources.py\", line 433, in dispatch_list\n return self.dispatch('list', request, **kwargs)\n\n File \"\/usr\/lib\/python2.7\/site-packages\/tastypie\/resources.py\", line 465, in dispatch\n response = method(request, **kwargs)\n\n File \"\/usr\/lib\/python2.7\/site-packages\/tastypie\/resources.py\", line 1347, in post_list\n updated_bundle = self.full_dehydrate(updated_bundle)\n\n File \"\/usr\/lib\/python2.7\/site-packages\/tastypie\/resources.py\", line 853, in full_dehydrate\n bundle.data[field_name] = field_object.dehydrate(bundle, for_list=for_list)\n\n File \"\/usr\/lib\/python2.7\/site-packages\/tastypie\/fields.py\", line 116, in dehydrate\n current_object = bundle.obj\n\nAttributeError: 'NoneType' object has no attribute 'obj'\n"} 

Любая идея, что я делаю неправильно? Спасибо!

ответ

3

Функция object_create неявно возвращает None, но Tastypie ожидает, что она вернет пучок. Посмотрите, как это реализовано в docs example.

Однако, поскольку вы не используете данные, отличные от ORM, вы можете просто пропустить obj_create и позволить Tastypie создать ресурс для вас.

+0

Я никогда не буду достаточно благодарен @ Railslide! Я должен вам :) У вас есть итальянский друг! – miks87