具有相关模型的静态集合的用户模型

时间:2018-10-11 15:56:06

标签: django django-models

说我在Django中有一个User模型,我想向用户添加一些成就。因此,我创建了一个Achieve模型:

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

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

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

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

3)在每个用户的管理面板中,我可以更改每个实现的状态(仅对已编辑的用户有效);

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

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

我提出的解决方案:

1)使用带有jsonfield的Achieve模型。商店在字典等json中实现,请使用管理面板的自定义小部件来显示复选框以更改状态)。但是在哪里存储全球成就集以创建新的/删除旧的成就呢?如何管理?

2)使用多对多字段来实现和实现没有状态的模型。原因:如果用户←→成就之间存在关系,则意味着用户获得了成就。

这两种解决方案我都不太喜欢,希望能为您提供建议。

P.S。 sqlite用作db,不允许使用其他数据库(例如mongo等)

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您想要的是AchieveUser之间的ManyToMany关系,但是能够在该关系上存储额外的数据(例如status)。

Django在模型上使用常规ManyToManyField时,实际上创建了一个中间模型来将关系存储在数据库中。通过向您的through添加一个ManyToManyField参数,您可以指定用于该关系的中间模型,并使用该关系存储额外的数据,如documented here

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)

然后,假设您有一个user和一个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
相关问题