Je suis en train de construire un modèle d'activité, quelque peu similaire à celui-ci package. Il a un acteur, un verbe et la cible.sérialiseur django-rest-framework pour l'objet ContentType
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)
Maintenant, chaque fois que la création d'un nouvel objet de modèles selon (offres, emploi et Nouvelles), un nouvel objet d'activité est créé, avec le target
étant l'objet de l'une de ces trois modèles.
eg. user (actor) published (verb) title (target)
class Tender(models.Model):
title = models.CharField(max_length=256)
description = models.TextField()
class Job(models.Model):
title = models.CharField(max_length=256)
qualification = models.CharField(max_length=256)
class News(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
title = models.CharField(max_length=150)
Pour obtenir ces données, je fais une API qui me obtenir les données JSON nécessaires. J'utilise django-rest-framework pour cela et très nouveau avec elle.
class ActorSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
class ActivitySerializer(serializers.HyperlinkedModelSerializer):
actor = ActorSerializer()
class Meta:
model = Activity
fields = ('url', 'actor', 'verb', 'pub_date')
Dans les serializers ci-dessus, je savais que actor
sera l'utilisateur. Et donc j'ai utilisé le modèle de l'utilisateur pour la classe ActorSerializer
. Mais comme pour le target
, il peut s'agir de l'un de ces trois modèles (News/Job/Tender).
Comment puis-je créer un sérialiseur (par exemple, classe TargetSerialier
) pour l'objet ContentType afin que je puisse utiliser le target
dans le champ de classe ActivitySerializer
?
Mais est-ce que cela signifie que ces champs sont seulement lus maintenant? Que faire si j'essaie de sauvegarder un ActivityObject? Si vous ne lui donnez pas un read_only, vous devez lui donner un jeu de questions, mais je ne sais pas quel sera le modèle avant qu'il ne soit là. Suis-je un malentendu? –