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')
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.
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')