2012-04-20 20 views
7

tengo este código:Tastypie - campo anidado Recurso no encontrado

#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 

El problema es que estoy recibiendo este error al enviar este objeto:

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

El campo 'vídeo' tiene se le dieron datos que no eran un URI, ni un diccionario similar a y no tiene un atributo 'pk': 21.

Si hago este comentario li NE:

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

Todo funciona bien, pero entonces no puede obtener esta información (vídeo) cuando se le pide a /api/v1/questions/

Mi pregunta es:

quizás sus ojos me pueden ayudar a encontrar el error :) ¡Gracias!

+0

¿Podría proporcionar cómo está enviando la solicitud? – mhaligowski

Respuesta

6

El campo 'vídeo' ha sido dada de datos que no era un URI, no un diccionario-igual y no tiene un 'pk' atributo: 21.

Por lo tanto, esto significa que el El número entero 21 no cumple con los requisitos para ese campo, también da una pista vaga de lo que cumplirá con los requisitos.

primero, puede enviar el URI para el registro, esta es probablemente la forma más correcta, ya que los URI son realmente únicos, mientras que los pk no lo son.

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

o, puede enviar un objeto similar al diccionario con el conjunto de campos pk.

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

La razón funciona cuando en comentario el campo ForeignKey es porque entonces tastypie la trata como una IntegerField, que puede ser referenciado por un entero normal.

Esto me ha atrofiado durante un tiempo, ¡espero que ayude!

Cuestiones relacionadas