2014-06-15 2 views
16

Non riesco a trovare il giusto ricerca su Google per questo così qui va:Django Serializer Metodo campo

Ho un campo nel mio serializzatore:

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

che conta tutto il campo relativo " inviare".

Ora voglio usare quel campo come parte del mio metodo:

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

è possibile?

+1

dove si trova il secondo metodo da? ('popolarità'), quindi dove vuoi accedere ai dati? –

+0

destro all'interno della classe serializer dove "likescount" è in @DenisCornehl –

risposta

36

assumendo post.count viene utilizzato per misurare il numero di calibro su un post e che in realtà non intendono dividere un numero intero da un timestamp nel metodo popolarità, quindi provare questo:

utilizzare un 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 

tuttavia vi consiglierei rendendo questa una proprietà nel modello

nel modello:

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

quindi utilizzare un generico Field fare riferimento a esso nel vostro serializzatore:

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

Hey ho implementato stesso, ma ha ottenuto seguente errore: 'AssertionError a/API/ricette/2 /' ' Field (READ_ONLY = True) dovrebbe essere ReadOnlyField' – Amit

+0

La seconda opzione è valida o migliore se il campo non è di sola lettura, funziona con CharField o qualsiasi tipo se è noto ... – danigosa

+1

Nel secondo caso, poiché il nome della variabile e la fonte sono uguali (popolarità), tu ottenere un 'AssertionError' a causa della ridondanza. Nel mio caso ho usato un ReadOnlyField, poiché è quello che mi serviva. – guival