1

我想在数据库中为每个用户存储一些琐碎的值,比如用户是否可以看到新来者的横幅、如何使用每个功能的说明等。当我们遇到时,值的数量会增加新的主意。

所以我考虑了两种存储这些数据的解决方案。每个值都有一个字段(因此表的结构至少会更改几次),或者所有这些类型的数据都有一个字段,因此它们作为字典存储在字段中(在此情况下,我担心它是否会损害数据库性能,我还需要编写更多的逻辑来解析字符串中的字典以及其他方式,并且如果将字典存储在 db 中与 db 的功能相矛盾)。

模型.py

class Instruction(models.Model):
    user=models.ForeignKey('auth.User')
    can_see_feature_foo_instruction=models.BooleanField()
    can_see_feature_bar_instruction=models.BooleanField()
    ...

或者

class Instruction(models.Model):
    user=models.ForeignKey('auth.User')
    instruction_prefs=models.CharField() #Value will be "{'can_see_foo_inst':True, 'can_see_bar_inst':False, ...}"

哪个是最好的解决方案?

4

4 回答 4

3

这取决于您是否需要能够搜索这些字段。如果是这样,则文本字段选项并不适合,因为不会对各个标志进行索引。但如果不是,那么这是一个非常好的解决方法。您可能需要考虑将其存储为 JSON,这可用作将 dicts 对象序列化为文本并将其取回的方法。在 Django 中有很多关于“JSONField”的实现,它们将为您序列化/反序列化 JSON。

于 2012-09-21T10:01:01.960 回答
1

您可以为每个用户的指令/权限的键值对创建模型。例如

class Instruction(models.Model):
    user=models.ForeignKey('auth.User')
    key = models.CharField(max_length=20)
    value = models.BooleanField()

然后,您可以根据每个用户的权限为他创建多个实例。

>>>> instr1 = Instruction()
>>>> instr1.user = user1
>>>> instr1.key = 'can_see_feature_foo'
>>>> instr1.value = True
>>>> instr1.save()
>>>> instr2 = Instruction()
>>>> instr2.user = user1
>>>> instr2.key = 'can_see_feature_bar'
>>>> instr2.value = True
>>>> instr2.save()
....
#To query
>>>> Instructions.filter(user=user1, key='can_see_feature_bar')
于 2012-09-21T10:02:57.387 回答
1

Django 有一个内置的权限系统。尝试阅读此链接https://docs.djangoproject.com/en/dev/topics/auth/#permissions

更新 我想如果你真的想使用指令模型。您可以使用 JSONField 之类的东西并使用它来存储指令。通过这种方式,您可以执行类似指令的操作来访问值。你可以试试用这个。https://github.com/derek-schaefer/django-json-field

于 2012-09-21T09:35:49.823 回答
0

如果您使用带有 CharField 的模型来存储指令并将 ManyToManyField 存储给用户,您可以创建任意数量的指令并将任意数量的指令分配给任意数量的用户。

class Instruction(models.Model):
    user = models.ManyToManyField('auth.User')
    instruction = models.CharField() # Value will be a single instruction
于 2012-09-21T09:34:43.917 回答