Django Tastypie POST-запрос для отношения OneToOne

Я недавно начал django-tastypie и до сих пор люблю фреймворк. Сказав это, я столкнулся с проблемой POST для отношения OneToOne к модели и потратил много времени, но не мог понять, чего не хватает. Вот код модели и ресурса -

Модель

class Question(TimeStampedModel):
    question_title = models.CharField("question title", max_length=100)     
    question_desc = models.TextField("question description", max_length=1000)
    .......

Вторая модель имеет отношение OneToOne к Вопросу -

class QuestionAnswer(TimeStampedModel):
    question = models.OneToOneField(Question)
    .....

Ресурс

ВопросОтветРесурс -

class QuestionAnswerResource(ModelResource):
    question = fields.ForeignKey('myapp.api.QuestionResource', 'question')

    class Meta:
        queryset = QuestionAnswer.objects.all()
        resource_name='questionanswer'

ВопросРесурс -

class QuestionResource(ModelResource):
    questionanswer = fields.OneToOneField('myapp.api.QuestionAnswerResource', 'questionanswer', full=True) 

    class Meta:
        queryset = Question.objects.all()
        resource_name = 'question'

С приведенной выше настройкой я получаю правильный ответ на GET с экземпляром вопроса вместе с его атрибутом ответа. Однако, когда я пытаюсь отправить данные POST, чтобы сохранить вопрос/ответ на этот вопрос, происходит сбой с ошибкой ниже:

"{"error_message": "", "traceback": "Traceback (последний последний вызов):\n\n File \"/Library/Python/2.7/site-packages/tastypie/resources.py\", строка 192 , ................................................... ...................... строка 636, в гидрате\n
значение = супер (ToOneField, self).hydrate(bundle)\n\n File \"/Library/Python/2.7/site-packages/tastypie/fields.py\", строка 154, в hydr\n elif self.attribute и getattr( bundle.obj, self.attribute, None):\n\n Файл \"/Library/Python/2.7/site-packages/Django-1.4.1-py2.7.egg/django/db/models/fields/related .py\", строка 343, в get\n поднять self.field.rel.to.DoesNotExist\n\nDoesNotExist\n"}"

Может ли кто-нибудь указать, что мне не хватает?


person Mutant    schedule 13.10.2012    source источник
comment
Это случилось со мной, когда я забыл добавить URI ресурса в вызов.   -  person Bartosz Dabrowski    schedule 14.11.2013


Ответы (1)


Я думаю, что это:

questionanswer = fields.OneToOneField('myapp.api.QuestionAnswerResource', 'questionanswer', full=True)

вызывает проблему. В вашей модели Question нет поля questionanswer, и Django ожидает этого.

Для проверки вы можете посмотреть, можете ли вы создавать экземпляры в оболочке. документы Tastypie говорят о ToOneField следующее:

Этот подкласс требует, чтобы уровень ORM Django работал правильно.

и я думаю, что это может быть не так.

Чтобы предоставить ответы на вопрос, вы можете установить related_name вот так:

question = fields.ForeignKey('myapp.api.QuestionResource', 'question', related_name = 'questionanswer')
person kgr    schedule 15.10.2012