Serialize ContentTypes

23 views
Skip to first unread message

Aamu Padi

unread,
Jun 21, 2016, 1:36:22 AM6/21/16
to Django REST framework

I am building an activity model, somewhat similar to this package. It has an actor, verb and the target.


class Activity(models.Model):
    actor_type
= models.ForeignKey(ContentType, related_name='actor_type_activities')
    actor_id
= models.PositiveIntegerField()
    actor
= GenericForeignKey('actor_type', 'actor_id')
    verb
= models.CharField(max_length=10)
    target_type
= models.ForeignKey(ContentType, related_name='target_type_activities')
    target_id
= models.PositiveIntegerField()
    target
= GenericForeignKey('target_type', 'target_id')
    pub_date
= models.DateTimeField(default=timezone.now)



Now whenever a new object of whichever models (Tender, Job and News) is created, a new Activity object is created, with the target being the objects of any of these three models.

eg. user (actor) published (verb) title (target)


class Job(models.Model):
    user
= models.ForeignKey(User)
    title
= models.CharField(max_length=150)
    qualification
= models.CharField(max_length=100)
    comments
= GenericRelation(Comment)
    activity
= GenericRelation(Activity)

class News(models.Model):
    user
= models.ForeignKey(User)
    title
= models.CharField(max_length=150)
    body
= models.TextField()
    article_image
= models.ImageField(upload_to=get_upload_file_name, blank=True)
    tags
= models.ManyToManyField(Tag)
    comments
= GenericRelation(Comment)
    activity
= GenericRelation(Activity)

class Tender(models.Model):
    user
= models.ForeignKey(User)
    title
= models.CharField(max_length=150)
    description
= models.TextField()
    comments
= GenericRelation(Comment)
    activity
= GenericRelation(Activity)



To get this data I am making an API which will get me the required json data. Now using django-rest-framework


class ActivitySerializer(serializers.RelatedField):
    def to_representation(self, value):
        if isinstance(value, User):
            return 'Bookmark: ' + value.username
        elif isinstance(value, News):
            return 'Bookmark: ' + value.title
        elif isinstance(value, Job):
            return 'Note: ' + value.title
        elif isinstance(value, Tender):
            return 'Bookmark: ' + value.title
        raise Exception('Unexpected type of tagged object')


But now I am getting this error:

TypeError at /postactivities/

init() takes exactly 1 argument (3 given)


How can I solve this problem? Your help and guidance is very much appreciated.


Thank you.

Aamu Padi

unread,
Jun 21, 2016, 2:18:04 AM6/21/16
to Django REST framework
Sorry, my bad. I had to use it in this way.

class ActivityObjectRelatedField(serializers.RelatedField):

   
def to_representation(self, value):
       
if isinstance(value, User):

           
return 'User: ' + value.username
       
elif isinstance(value, News):
           
return 'News: ' + value.title
       
elif isinstance(value, Job):
           
return 'Job: ' + value.title
       
elif isinstance(value, Tender):
           
return 'Tender: ' + value.title
       
raise Exception('Unexpected type of tagged object')

class ActivitySerializer(serializers.HyperlinkedModelSerializer):
    actor
= ActivityObjectRelatedField(read_only=True)
    target
= ActivityObjectRelatedField(read_only=True)

   
class Meta:
        model
= Activity
        fields
= ('url', 'actor', 'verb', 'target', 'pub_date')

Reply all
Reply to author
Forward
0 new messages