我已经完成了问题,best way to implement privacy on each field in model django它的答案似乎并没有解决我的问题,所以我在这里问一些相关的问题,
好吧,我有一个用户模型。我希望用户能够控制他们个人资料中每个字段的隐私(可能是 gender
、education
、interests
等。 ..).
隐私选项不能仅限于私有(private)或公共(public),而是描述性的
- 公开
- friend
- 只有我
- 好友列表 1 (User.friendlist.one)
- 好友列表 2 (User.friendlist.two)
- 好友列表 3 (User.friendlist.three)
- 用户可以创建的另一个无限列表。
我也不希望将这些隐私选项保存在另一个模型上,但同样如此,通过一次查询我可以获取用户对象以及隐私选项。
所以如果我有 UserModel,
class User(models.Model):
name = models.CharField()
email = models.EmailField()
phone = models.CharField()
如何在此处设置隐私设置?我正在使用 postgres,我可以映射 JSON 字段或 Hstore 甚至 ArrayField 吗?
人们过去用 Django 解决同样问题的最佳解决方案是什么?
更新:
我有 n 个模型字段。我真正想要的是将每个实例的隐私设置存储在自身或其他一些方便的方式上。
最佳答案
我已经解决了我的问题,尝试了具有权限和其他关系的解决方案。我有一个 Relationship
模型,所有其他关系列表都是从 Relationship
模型派生的,所以我不想维护一个单独的列表关系。
所以我的选择是使用 Postgres JSONField 或 HStoreField。由于 Django 对 postgres freatures 有很好的支持,我发现这些点对我做出的选择很有利。
- 可以使用 Django ORM 查询 JSON/HashStore。
- 配置是纯 JSON/HashStore,比权限和关系更易于编辑和维护。
- 我发现使用权限比使用 JSON/HStore 花费的数据库查询时间更长。 (点击率更高)
- 添加和验证每个字段的权限比添加/验证 JSON 复杂。
- 在将来的某个时候如果出现更简单或更轻松的解决方案,我可以迁移到它,在单个字段中进行完整配置。
所以我的选择是使用配置模型。
class UserConfiguration(models.Model):
user = # link to the user model
configuration = #either an HStore of JSONFeild
然后编写了一个验证器来确保配置数据模型在保存和更新时不会被弄乱。我将字段分组以最小化验证字段。然后编写了一个简单的解析器,它获取用户并找到它们之间的关系,然后与配置进行映射以返回允许的字段数据(在未优化的实现中以 2-4 毫秒记录,现在已经足够了)。 (在获得许可的情况下,我需要维护一个单独的 friend 列表,并且应该在更新隐私配置时更新所有组权限,然后我仍然必须验证权限并处理它,这可能需要比这更少的时间,但复杂系统的成本)。
我认为这种方法也具有可扩展性,因为大部分处理都是在 Python 中完成的,并且数据库调用被尽可能减少。
更新
我进一步细化了数据库查询。在之前的实现中,用户之间的关系迭代,耗时约 1-2 毫秒,将此实现更改为 .value_list('relations', flat=True)
将查询时间减少到 400-520µs。
关于python - Django 为每个模型字段设置隐私选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42315704/