2014-06-15 15 views
16

इस के लिए सही Google खोज को खोजने के लिए तो यहाँ यह जाता है प्रतीत नहीं कर सकते:Django Serializer विधि फ़ील्ड

मैं अपने serializer में एक क्षेत्र है:

likescount = serializers.IntegerField(source='post.count', read_only=True) 

जो सभी संबंधित क्षेत्र में गिना जाता है " पद"।

def popularity(self, obj): 
     like = self.likescount 
      time = datetime.datetime.now() 
      return like/time 

यह संभव है:

अब मैं अपने विधि के हिस्से के रूप कि क्षेत्र का उपयोग करना चाहते हैं?

+1

जहां से दूसरी विधि है? ('लोकप्रियता'), तो आप डेटा का उपयोग कहां से प्राप्त करना चाहते हैं? –

+0

सही serializer वर्ग जहां "likescount" @DenisCornehl में है अंदर –

उत्तर

36

post.count संभालने एक पोस्ट को पसंद करने की संख्या मापने के लिए इस्तेमाल किया जा रहा है और आप वास्तव में अपने लोकप्रियता विधि में एक टाइमस्टैम्प द्वारा एक पूर्णांक विभाजित करने के लिए इरादा नहीं है, तो यह प्रयास करें:

एक SerializerMethodField

का उपयोग
likescount = serializers.SerializerMethodField('get_popularity') 

def popularity(self, obj): 
    likes = obj.post.count 
    time = #hours since created 
    return likes/time if time > 0 else likes 

लेकिन मैं अपने मॉडल

अपने मॉडल में

में यह एक संपत्ति बनाने की सिफारिश करेंगे:

@property 
def popularity(self): 
    likes = self.post.count 
    time = #hours since created 
    return likes/time if time > 0 else likes 

फिर अपने serializer में यह संदर्भित करने के लिए एक सामान्य Field का उपयोग करें:

class ListingSerializer(serializers.ModelSerializer): 
    ... 
    popularity = serializers.Field(source='popularity') 
+1

अरे मैं एक ही लागू किया लेकिन निम्न त्रुटि मिला: '/ API/व्यंजनों पर AssertionError/2 /' ' फील्ड (read_only = सच) ReadOnlyField' – Amit

+0

होना चाहिए दूसरा विकल्प मान्य या बेहतर है यदि फ़ील्ड केवल पढ़ने के लिए नहीं है, यह CharField या किसी भी प्रकार के साथ काम करता है यदि यह ज्ञात है ... – danigosa

+1

दूसरे मामले में, क्योंकि परिवर्तनीय नाम और स्रोत समान (लोकप्रियता) हैं, आप अनावश्यकता के कारण 'AssertionError' प्राप्त करें। मेरे मामले में मैंने एक ReadOnlyField का उपयोग किया, क्योंकि इसकी आवश्यकता थी। – guival

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