2012-05-06 33 views
6

Tôi đang làm việc với một số tài nguyên django-tastypie đơn giản với vấn đề sau:Tôi làm cách nào để Django-Tastypie ghi đè tài nguyên nếu nó đã tồn tại?

Hãy tưởng tượng tôi đang xây dựng một hệ thống xếp hạng đơn giản. Tôi có tài nguyên, gọi số này là Rating có cả số User và một số Comment. Mỗi người dùng có tối đa một xếp hạng cho mỗi nhận xét.

Tôi muốn tạo một tài nguyên chung có một bộ tóan ('user', 'comment'). Sau đó, bất cứ khi nào tôi thực hiện POST với một số mới Rating, tôi muốn nó kiểm tra các trường usercomment để xem liệu xếp hạng có phù hợp với cả hai trường đó đã tồn tại hay không. Nếu có, ghi đè lên tài nguyên hiện có, nếu không tạo một tài nguyên mới (để bất kỳ cuộc gọi API nào cũng sẽ vượt qua số unique_together của Django).

Tôi đang làm việc với obj_get làm điểm bắt đầu, nhưng gặp khó khăn khi hiểu cách ghi đè chính xác để có hành vi này.

Trả lời

6

Sau khi thảo luận về IRC trong #tastypie:

Đó là khuyến cáo không để thay đổi hành vi tiêu chuẩn API, vì điều này có thể nguy hiểm theo nghĩa là khách hàng sẽ không nhìn thấy hành vi nhất quán trên các API.

Một giải pháp là để Tastypie trả về phản hồi 4xx khi cố gắng tạo Rating và trong trường hợp này, khách hàng sẽ đánh giá hiện tại là PATCH.

Nếu, tuy nhiên, tăng hiệu suất là thực sự cần, bạn chỉ nên thay đổi hành vi nếu khách hàng chính thức yêu cầu điều này. Trường hợp nào của bạn có nghĩa là thêm thông số replace_existing_rating=True vào yêu cầu POST.

Vì vậy, trong trường hợp của bạn, nếu bạn đã quyết định bạn cần tăng hiệu suất, bạn có thể:

class CommentResource(ModelResource): 
    def obj_create(self, bundle, request=None, **kwargs): 
     if bundle.data.get("replace_existing_rating", False): 
      try: 
       bundle.obj = self._meta.object_class._default_manager.get(**conditions) 
      except self._meta.object_class.DoesNotExist: 
       bundle.obj = self._meta.object_class() 
Các vấn đề liên quan