首页 > 解决方案 > 具有静态相关模型集的用户模型

问题描述

假设我User在 django 中有一个模型,我想为用户添加一些成就。所以我创建了一个Achieve模型:

class Achive:
    type = ....
    value = ....
    status = BooleanField(default=False)

我希望所有这些成就成为每个用户(例如 20 个实例)的静态模型集,能够删除旧的成就并创建新的成就。问题是如何去做。预期流量为:

1) 授予使用成就系统的用户;

2)用户获得了所有这些成就(在管理面板中显示为表格);

3)在每个用户的管理面板中,我可以更改每个成就的状态(仅影响已编辑的用户);

4)如果创建了新的成就实例——添加到所有有成就的用户;

5) 如果存在,Achieve 实例已被删除——从所有用户中删除;

我提出的解决方案:

1)将Achieve模型与jsonfield一起使用。像字典一样存储在 json 中,使用管理面板的自定义小部件来显示复选框以更改状态)。但是在哪里存储全局成就集以创建新的/删除旧的?如何管理它?

2)使用多对多字段来实现和实现无状态模型。为什么:如果用户←→成就之间的关系存在,这意味着用户获得了成就。

这两种解决方案我都不太喜欢,希望得到您的建议。

PS sqlite用作db,不允许使用其他(如mongo等)

提前致谢!

标签: djangodjango-models

解决方案


Achieve您想要的是和之间的多对多关系User,但能够在关系上存储额外数据(status例如)。

使用模型上的法线ManyToManyField,Django 实际上创建了一个中间模型来将关系存储在数据库中。通过向throughyour 添加参数ManyToManyField,您可以指定用于关系的中间模型并使用关系存储额外的数据,如此所述:

class Goal(models.Model):
    type = ...
    value = ...
    achievers = models.ManyToManyField(to=User, through='Achievement', related_name='goals')

class Achievement(models.Model):
    status = models.BooleanField()
    date_reached = models.DateField(null=True)
    goal = models.ForeignKey(to=Goal, on_delete=models.CASCADE)
    achiever = models.ForeignKey(to=User, on_delete=models.CASCADE)

然后你可以创建和查询这样的关系,假设你有 auser和 a goal

achievement = Achievement.objects.create(status=True, date_reached=date(2018, 10, 12), achiever=user, goal=goal)
user.goals.filter(achievement__status=True)  # gives the achieved goals of a user
goal.achievers.filter(achievement__status=True)  # gives the users that achieved a goal

推荐阅读