在模型中创建点子集

2024-04-20 06:13:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种可扩展的方法来创建新的用户点子集,而不必在每次创建新子集时进行迁移。你知道吗

例如,假设我有一个users应用程序,其中total_points是每个用户的pts_1pts_2pts_3之和。你知道吗

我还创建了一个campaigns应用程序,使用户可以通过执行一个操作(例如,为了简单起见,单击一个按钮)来获得积分。我可以通过Django管理员向平台添加新的活动,并对其进行设置,这样当用户完成活动时,他们就可以获得积分,从而(campaign, pk=n)获得该用户pts_n的积分。你知道吗

但是,为了做到这一点,我需要手动将pts_n添加到models.py并迁移到数据库。有更好的解决办法吗?我唯一能想到的就是分批预填充pts_n,以避免每次添加新活动时迁移。你知道吗

我是不是想错了?我对这个很陌生。你知道吗


Tags: django方法用户应用程序管理员平台按钮users
1条回答
网友
1楼 · 发布于 2024-04-20 06:13:37

最简单的解决方案是创建一个UserPoints模型,在其中记录积分的授予。你知道吗

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)

此模型假定类别是可选的。你知道吗

现在您可以动态计算用户的积分:

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

如果您只想要某个类别的点数:

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

您经常向数据库中添加pts_n列的解决方案在这里显然不可取,因为这将是一项大量工作,而且您将使用total_points列作为其他列的聚合,这不是推荐的做法。你知道吗

相关问题 更多 >