Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Serializer Method Field

Can't seem to find the right google search for this so here it goes:

I have a field in my serializer:

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

which counts all the related field "post".

Now I want to use that field as part of my method:

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

Is this possible?

like image 501
John D Avatar asked Jun 15 '14 20:06

John D


People also ask

What is serializer method field in Django?

Each field in a Form class is responsible not only for validating data, but also for "cleaning" it — normalizing it to a consistent format. — Django documentation. Serializer fields handle converting between primitive values and internal datatypes.

How do you make a field optional in a serializer?

By default it is set to False. Setting it to True will allow you to mark the field as optional during "serialization". Note: required property is used for deserialization.

What is Read_only true in Django?

Any 'read_only' fields that are incorrectly included in the serializer input will be ignored. Set this to True to ensure that the field is used when serializing a representation, but is not used when creating or updating an instance during deserialization.

What is To_representation Django?

to_representation(self, value) method. This method takes the target of the field as the value argument, and should return the representation that should be used to serialize the target. The value argument will typically be a model instance.


1 Answers

assuming post.count is being used to measure the number of likes on a post and you don't actually intend to divide an integer by a timestamp in your popularity method, then try this:

use a 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 

however I would recommend making this a property in your model

in your model:

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

then use a generic Field to reference it in your serializer:

class ListingSerializer(serializers.ModelSerializer):     ...     popularity = serializers.Field(source='popularity') 
like image 168
tomcounsell Avatar answered Sep 30 '22 00:09

tomcounsell