2012-04-20 1 views
7

У меня есть этот код:Tastypie - поле Вложенные Ресурс не найден

#api model 

class VideoResource(ModelResource): 
    class Meta: 
     queryset = Video.objects.all() 
     include_resource_uri = False 
     resource_name = 'video' 
     authorization = DjangoAuthorization() 

class QuestionResource(ModelResource): 

    user = fields.ToOneField(UserResource,'user',full=True) 
    video = fields.ForeignKey(VideoResource,'video',full=True) 

    class Meta: 
     queryset = Question.objects.all() 
     resource_name = 'question' 
     include_resource_uri = False 
     authorization = DjangoAuthorization() 

    def obj_create(self, bundle, request=None, **kwargs): 
     import json 
     temp = json.loads(request.body, object_hook=_decode_dict) 
     video = Video.objects.get(pk=temp['video']) 
     return super(QuestionResource, self).obj_create(bundle, request, user=request.user, video=video) 

#model 

class Question(models.Model): 
    text = models.CharField('Question',max_length=120) 
    created = models.DateTimeField(auto_now_add=True) 
    enabled = models.BooleanField(default=True) 
    flag = models.BooleanField(default=False) 
    allow_comments = models.BooleanField(default=True) 
    thumbnail_url = models.CharField(default='video.jpg',blank=True, null=True,max_length=200) 

    user = models.ForeignKey(User) 
    video = models.ForeignKey(Video) 

    def __unicode__(self): 
     return self.text; 

class Video(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now_add=True) 
    url = models.URLField(default="") 

    user = models.ForeignKey(User) 

    def __unicode__(self): 
     return str(self.pk) + ' > ' + self.status 

Проблема заключается в том, что я получаю эту ошибку при передаче этого объекта:

{"video":21,"text":"sadasds"} 

Поле «видео» имеет были предоставлены данные, которые не были URI, а не , и не имеют атрибута «pk»: 21.

Если я прокомментирую это li пе:

video = fields.ForeignKey(VideoResource,'video',full=True) 

Все работает отлично, но я не могу получить эту информацию (видео) когда просят /api/v1/questions/

Мой вопрос:

  • Должен ли я создать на ресурсы, с кем сообщение и другое для получения информации < - это кажется не очень хорошим решением. или
  • Как создать вложенные ресурсы? Я попытался следовать примеру на в сети http://django-tastypie.readthedocs.org/en/latest/cookbook.html#nested-resources , но, как вы можете видеть по какой-то причине, не работает.

Возможно, ваши глаза могут помочь мне найти ошибку :) Спасибо!

+0

Вы бы указали, как вы отправляете запрос? – mhaligowski

ответ

6

Поля «видео» имеет получили данные, что не было URI, а не словарь, так и не иметь «рк атрибута»: 21.

Таким образом, это означает, что целое число 21 не соответствует требованиям для этого поля, оно также дает неопределенный намек на то, что будет соответствовать требованиям.

Во-первых, вы можете отправить в URI для записи, это, вероятно, самый правильный способ, поскольку URI действительно уникальны, а pk - нет.

{"video":"/api/v1/video/21","text":"sadasds"} 

или вы можете отправить в словаре-подобный объект с помощью набора полей pk.

{"video":{'pk':21},"text":"sadasds"} 

Причина это работает, когда вы закомментировать ForeignKey поле, потому что тогда tastypie рассматривает его как IntegerField, который можно ссылаться на простое целое число.

Это помогло мне ненадолго, надеюсь, это поможет!