2012-04-20 8 views
7

tôi có mã này:Tastypie - lĩnh vực lồng Resource không tìm thấy

#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 

Vấn đề là tôi nhận được lỗi này khi gửi đối tượng này:

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

Trường 'video' có đã được cung cấp dữ liệu không phải là một URI, không phải là một từ điển là và không có thuộc tính 'pk': 21.

Nếu tôi nhận xét điều này li ne:

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

Tất cả mọi thứ hoạt động tốt, nhưng sau đó tôi không thể nhận được thông tin này (video) khi hỏi đến /api/v1/questions/

Câu hỏi của tôi là:

  • Tôi có nên tạo các nguồn lực, từ một đến và một người khác để truy xuất thông tin < - điều này có vẻ không phải là một giải pháp thực sự tốt. hoặc
  • Làm cách nào để tạo tài nguyên lồng nhau? Tôi đã cố gắng làm theo ví dụ trên web http://django-tastypie.readthedocs.org/en/latest/cookbook.html#nested-resources nhưng như bạn có thể thấy vì một số lý do không hoạt động.

có thể đôi mắt của bạn có thể giúp tôi tìm ra lỗi :) Cảm ơn!

+0

bạn sẽ plese cung cấp cách bạn gửi yêu cầu? – mhaligowski

Trả lời

6

Trường 'video' đã được đưa ra dữ liệu mà không phải là một URI, không phải là một từ điển tương tự và không có một 'pk' thuộc tính: 21.

Vì vậy, điều này có nghĩa rằng số nguyên 21 không đáp ứng các yêu cầu cho trường đó, nó cũng đưa ra một gợi ý mơ hồ về những gì sẽ đáp ứng các yêu cầu.

trước tiên, bạn có thể gửi URI cho bản ghi, đây có lẽ là cách chính xác nhất vì các URI thực sự là duy nhất trong khi pk thì không.

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

hoặc, bạn có thể gửi một đối tượng giống từ điển với bộ trường pk.

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

Lý do hoạt động khi bạn nhận xét trường ForeignKey là vì sau đó ngon xử lý nó là IntegerField, có thể được tham chiếu bởi số nguyên đơn giản.

Điều này đã khiến tôi còi cọc một lúc, hy vọng điều đó sẽ hữu ích!