关于在Django数据库中存储一些简单值的体系结构的建议?

时间:2012-09-21 09:25:44

标签: database django

我想为数据库中的每个用户存储一些微不足道的值,比如用户是否可以看到新来者的横幅,关于如何使用每个功能的说明等。值的数量可以增加为我们遇到了新的想法。

所以我想到了两种存储这些数据的解决方案。要么为每个值都有一个字段(所以表的结构至少会改变几次),或者为所有这些类型的数据都有一个字段,所以它们存储为字段中的字典(在这种情况下,我担心如果它损害了数据库性能,我还需要编写更多逻辑来解析字符串中的字典和方式,如果在db中存储字典与什么相矛盾db确实)。

models.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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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')

答案 3 :(得分:0)

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

class Instruction(models.Model):
    user = models.ManyToManyField('auth.User')
    instruction = models.CharField() # Value will be a single instruction