django - 具有静态相关模型集的用户模型
问题描述
假设我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等)
提前致谢!
解决方案
Achieve
您想要的是和之间的多对多关系User
,但能够在关系上存储额外数据(status
例如)。
使用模型上的法线ManyToManyField
,Django 实际上创建了一个中间模型来将关系存储在数据库中。通过向through
your 添加参数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
推荐阅读
- javascript - node_modules/rxjs-compat/operator/shareReplay.d.ts(2,10) 中的错误:
- zurb-foundation - 未定义所需 JS 文件中的函数
- reactjs - 闪存消息测试因 react-testing-library / material-ui 失败
- c++ - x86 opencv 中的 hresult 0x80070008 内存资源不足错误
- java - 返回 ArrayList 项而不是布尔值
- java - 如何将一列数据附加到文本文件的末尾
- php - 作为中间表创建的项目表的 Eloquent Relation
- typescript - 使用模块扩充删除先前的声明
- php - 无法排序数组索引php
- python - 如何将实时音频从麦克风转换为文本?