2012-05-06 19 views
6

मैं निम्नलिखित समस्या के साथ कुछ साधारण django-tastypie संसाधनों के साथ काम कर रहा हूं:यदि मैं पहले से मौजूद हूं तो Django-Tastypie संसाधन को ओवरराइड कैसे कर सकता हूं?

कल्पना कीजिए कि मैं एक साधारण रेटिंग सिस्टम बना रहा हूं। मेरे पास संसाधन है, इसे Rating पर कॉल करें जिसमें User और Comment दोनों हैं। प्रत्येक उपयोगकर्ता के पास प्रति टिप्पणी सबसे अधिक रेटिंग होती है।

मैं एक सामान्य संसाधन बनाना चाहता हूं जो एक ट्यूपल ('user', 'comment') लेता है। फिर, जब भी मैं एक नया Rating के साथ एक पोस्ट करता हूं, तो मैं यह देखना चाहता हूं कि user और comment फ़ील्ड को यह देखने के लिए कि क्या उन दोनों फ़ील्ड से मेल खाने वाली रेटिंग पहले से मौजूद है या नहीं। यदि ऐसा होता है, तो मौजूदा संसाधन को ओवरराइट करें, अन्यथा एक नया संसाधन बनाएं (ताकि कोई भी एपीआई कॉल हमेशा Django के unique_together को पास करे)।

मैं शुरुआती बिंदु के रूप में obj_get के साथ काम कर रहा हूं, लेकिन इस व्यवहार को प्राप्त करने के लिए इसे ठीक से ओवरराइड करने के तरीके को समझने में कठिनाई हो रही है।

उत्तर

6

#tastypie में आईआरसी पर चर्चा के बाद:

यह मानक एपीआई व्यवहार में परिवर्तन करने के लिए नहीं की सिफारिश की है के रूप में इस अर्थ में खतरनाक हो सकता है कि ग्राहकों एपीआई भर में लगातार व्यवहार नहीं देख सकेंगे।

एक समाधान यह है कि Rating बनाने की कोशिश करते समय Tastypie को 4xx प्रतिक्रिया दें, और इस मामले में ग्राहक PATCH मौजूदा रेटिंग करेगा।

यदि प्रदर्शन प्रदर्शन में वास्तव में आवश्यक है, तो आपको केवल व्यवहार को बदलना चाहिए यदि ग्राहक औपचारिक रूप से इसके लिए पूछता है। आपके मामले में पैरामीटर POST अनुरोध में जोड़ने का मतलब होगा।

अपने मामले में

तो, आप आप प्रदर्शन को बढ़ावा देने की जरूरत है तय किया है, तो आप:

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() 
संबंधित मुद्दे

 संबंधित मुद्दे