说我在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等)
提前谢谢!
答案 0 :(得分:0)
您想要的是Achieve
和User
之间的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