在 django-models 中创建点子集
Creating points subsets in django-models
我正在寻找一种可扩展的方式来创建新的用户点子集,而无需在每次创建新子集时都进行迁移。
例如,假设我有一个 users
应用程序,其模型中 total_points
是 pts_1
、pts_2
和 pts_3
的总和每个用户。
我还创建了一个 campaigns
应用程序,使用户能够通过执行操作(例如,为简单起见单击按钮)来赚取积分。我可以通过 Django 管理员向平台添加新的活动并进行设置,以便当用户完成活动时,他们会获得积分,这样 (campaign, pk=n)
用户的 pts_n
.
积分
但是,为了做到这一点,我需要手动将pts_n
添加到models.py
并迁移到数据库。有更好的解决方案吗?我唯一能想到的是分批预填充 pts_n
以避免每次添加新活动时都进行迁移。
我是不是想错了?我对此很陌生。
最简单的解决方案是创建一个 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
列作为其他列的聚合,这不是推荐的做法。
我正在寻找一种可扩展的方式来创建新的用户点子集,而无需在每次创建新子集时都进行迁移。
例如,假设我有一个 users
应用程序,其模型中 total_points
是 pts_1
、pts_2
和 pts_3
的总和每个用户。
我还创建了一个 campaigns
应用程序,使用户能够通过执行操作(例如,为简单起见单击按钮)来赚取积分。我可以通过 Django 管理员向平台添加新的活动并进行设置,以便当用户完成活动时,他们会获得积分,这样 (campaign, pk=n)
用户的 pts_n
.
但是,为了做到这一点,我需要手动将pts_n
添加到models.py
并迁移到数据库。有更好的解决方案吗?我唯一能想到的是分批预填充 pts_n
以避免每次添加新活动时都进行迁移。
我是不是想错了?我对此很陌生。
最简单的解决方案是创建一个 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
列作为其他列的聚合,这不是推荐的做法。