2016-09-16 3 views
0

Je suis à la recherche d'un moyen évolutif de créer de nouveaux sous-ensembles de points utilisateur sans migrer chaque fois qu'un nouveau sous-ensemble est créé.Créer des sous-ensembles de points dans les modèles django

Par exemple, dire que j'ai une application users avec un modèle où total_points est la somme des pts_1, pts_2 et pts_3 pour chaque utilisateur.

J'ai également créé une application campaigns qui permet aux utilisateurs de gagner des points en effectuant une action (par exemple, en cliquant sur un bouton pour plus de simplicité). Je peux ajouter de nouvelles campagnes à la plate-forme via l'administrateur Django et la configurer de sorte que lorsque les utilisateurs complètent les campagnes, ils sont crédités de points tels que (campaign, pk=n) crédits pts_n de l'utilisateur. Toutefois, pour ce faire, j'ai besoin d'ajouter manuellement pts_n à models.py et de migrer vers la base de données. Y a-t-il une meilleure solution? La seule chose que je peux penser est de pré-remplir pts_n par lots pour éviter la migration chaque fois que j'ajoute une nouvelle campagne. Est-ce que je pense à ceci de la mauvaise manière? Je suis assez nouveau à cela.

Répondre

1

La solution la plus simple serait de créer un modèle UserPoints où vous enregistrer l'attribution de points.

class UserPoints(models.Model): 
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE) 
    date = models.DateTimeField(auto_now_add=True) 
    points_amount = models.IntegerField(default=1) 
    points_category = models.CharField(max_length=50, blank=True, null=True) 

Ce modèle suppose que la catégorie est facultative.

Maintenant, vous pouvez dynamiquement calculer un des points de l'utilisateur:

user = request.user 
UserPoints.objects.filter(user=user).aggregate(Sum('points_amount')) 

Si vous voulez juste la quantité de points d'une certaine catégorie:

category = 'my_category'  
UserPoints.objects.filter(user=user, category=category).aggregate(Sum('points_amount')) 

Votre solution où vous constamment ajouterez pts_n colonnes La base de données n'est clairement pas préférable ici, car cela représenterait beaucoup de travail et vous utiliseriez la colonne total_points comme un agrégat d'autres colonnes, ce qui n'est pas recommandé.