2012-07-02 10 views
5

Trang web Django của tôi có một mô hình Ảnh đại diện cho ảnh trong hệ thống và tôi đang sử dụng Django.contrib.comments để cho phép người dùng nhận xét về những điều này. Đây là tất cả làm việc tốt nhưng tôi muốn mở rộng Tastypie API của tôi để cho phép truy cập các ý kiến ​​cho PhotoResource của tôi bằng cách sử dụng một URL như /api/v1/photo/1/comments trong đó 1 là id của bức ảnh. Tôi có thể làm cho URL hoạt động tốt nhưng không có vấn đề gì về loại lọc tôi đang làm tôi luôn luôn dường như trả lại bộ hoàn chỉnh các ý kiến ​​chứ không chỉ là tập hợp cho ảnh được cung cấp. Tôi đã bao gồm lựa chọn cắt giảm mã API hiện tại của mình bên dưới:Trả lại nhận xét Django cho tài nguyên Tastypie

class CommentResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 
    class Meta: 
     queryset = Comment.objects.all() 
      filtering = { 
       'user': ALL_WITH_RELATIONS, 
      } 

class PhotoResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 
    class Meta: 
     queryset = Photo.objects.all() 
     filtering = { 
      'id': 'exact', 
      'user': ALL_WITH_RELATIONS 
     } 

    def prepend_urls(self): 
     return [url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/comments%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_comments'), name="api_get_comments"), 
     ] 

    def get_comments(self, request, **kwargs): 
     try: 
      obj = self.cached_obj_get(request=request, **self.remove_api_resource_names(kwargs)) 
     except ObjectDoesNotExist: 
      return HttpGone() 
     except MultipleObjectsReturned: 
      return HttpMultipleChoices("More than one resource is found at this URI.") 
     comment_resource = CommentResource() 
     return comment_resource.get_list(request, object_pk=obj.id, content_type=ContentType.objects.get_for_model(Photo)) 

Theo tôi có thể nói đó là bộ lọc ở dòng cuối cùng không hoạt động. Tôi nghĩ điều này hơi phức tạp do contrib.com sử dụng ContentTypes để liên kết với đối tượng đang được nhận xét mà tôi đoán Tastypie có thể không đương đầu được. Tôi đã thử một loạt các biến thể về điều này nhưng nó vẫn không hoạt động. Tôi cảm thấy khá chắc chắn điều gì đó như thế này sẽ hoạt động:

ctype = ContentType.objects.get_for_model(obj) 
comment_resource = CommentResource() 
return comment_resource.get_list(request, object_pk=obj.pk, content_type_id=ctype.id) 

nhưng một lần nữa tất cả các nhận xét đã được trả lại.

Có ai có bất kỳ ý tưởng nào về cách thực hiện điều này (hoặc nếu nó thậm chí có thể)?

+0

Bạn có giải quyết nó? Nếu có, làm thế nào? – silviomoreto

Trả lời

1

Thông thường thay vì xâm nhập vào PhotoResource, tôi sẽ thực hiện lọc trong CommentResource. Bạn phải kích hoạt lọc cho mô hình đó và url sẽ trông như thế này:

/api/v1/nhận xét/object__pk = 1 & content_type_id = 2

+0

Yup, tôi đã cân nhắc làm điều gì đó tương tự nhưng đối với tôi nó không thực sự tạo ra một URL tốt. Tôi không bao giờ quan tâm đến các bình luận, chỉ có các bình luận liên quan đến một bức ảnh, đó là lý do tại sao tôi muốn URL ở định dạng '/ photo/1/comments' hơn. Tôi đã thực hiện một số tiến bộ về điều này trước khi được sidetracked vì vậy hy vọng tôi sẽ có thể chia sẻ kết quả của tôi sớm. – Roarster

+0

Hey @Roarster, tôi cũng đang gặp vấn đề tương tự, chúng tôi có thể giải quyết nó ?! – noahandthewhale

+1

Thật không may là không. Tôi đã kết thúc từ bỏ Tastypie và sử dụng [Django REST Framework] (http://django-rest-framework.org/) để thay thế. Tastypie rất dễ dàng để đi nhưng tôi thực sự đấu tranh khi tôi cần một cái gì đó bên ngoài của bình thường. DRF đã làm điều này dễ dàng hơn nhiều mặc dù nó đã mất nhiều công sức hơn một chút để có được đi. Nó cũng có vẻ là một chút tích cực hơn về phía phát triển đó là tốt. – Roarster