J'ai une architecture complexe pour ma base de données et j'ai des difficultés à écrire l'API REST correspondante.
Le contexte : Je demande diverses informations sur une API publique toutes les heures, y compris des données dont je veux conserver l'historique.
Voici les modèles que j'utilise
class Player(models.Model):
name = models.CharField(max_length=255)
class PlayerStatsHistory(models.Model):
player = models.ForeignKey('Player', null=True, on_delete=models.CASCADE)
last_refresh = models.DateTimeField(null=True)
...
De cette façon, je peux stocker chaque changement dans les statistiques de chaque utilisateur. J'ai écrit 2 sérialiseurs, un pour Player
et un pour PlayerStatsHistory
. Le plus simple fonctionne bien
class PlayerStatsSerializer(HyperlinkedModelSerializer):
class Meta:
model = PlayerStatsHistory
fields = ('last_refresh', ...)
Mais lorsque j'ai besoin de demander les dernières statistiques d'un joueur, je ne sais plus où j'en suis :
class PlayerSerializer(HyperlinkedModelSerializer):
details = SerializerMethodField()
def get_details(self, obj):
return PlayerStatsSerializer(PlayerStatsHistory.objects.filter(player=obj).order_by('-last_refresh').first()).data
class Meta:
model = Player
fields = ('name', 'details')
Cela fonctionne bien, mais la base de données sera frappée à chaque joueur fourni à la base de données de l'UE. PlayerSerializer
et j'ai l'impression que je m'y prends mal.
Comment puis-je améliorer cette solution ?