1

各ユーザーの簡単な値をデータベースに保存したいと思います。たとえば、ユーザーが新参者のバナーを見ることができるかどうか、各機能の使用方法の説明などです。値の数は、遭遇するにつれて増える可能性があります。新しいアイデア。

そこで、これらのデータを保存するための2つのソリューションについて考えました。これらの値ごとにフィールドがあるか(したがって、テーブルの構造は少なくとも数回変更されます)、またはこれらすべてのタイプのデータに対して1つのフィールドがあるため、フィールドにディクショナリとして格納されます(この場合場合によっては、dbのパフォーマンスが低下するかどうかが心配です。また、辞書を文字列で解析するためのロジックをさらに作成する必要があります。また、辞書を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

4 に答える 4

3

これらのフィールドを検索できるようにする必要があるかどうかによって異なります。その場合、個々のフラグにインデックスが付けられないため、テキストフィールドオプションは実際には適切ではありません。しかしそうでない場合、これはそれを実行するための完全に良い方法です。JSONとして保存することを検討することをお勧めします。これは、dictオブジェクトをテキストにシリアル化して元に戻す方法として役立ちます。Djangoの「JSONField」には、JSONのシリアル化/逆シリアル化を行う実装がたくさんあります。

于 2012-09-21T10:01:01.960 に答える
1

Djangoには許可システムが組み込まれています。このリンクを読んでみてくださいhttps://docs.djangoproject.com/en/dev/topics/auth/#permissions

更新 本当に命令モデルを使いたいのならと思います。JSONFieldのようなものを使用して、命令を保存することができます。このようにして、instruction.keyのようなことを実行して値にアクセスできます。これを使ってみることができます。https://github.com/derek-schaefer/django-json-field

于 2012-09-21T09:35:49.823 に答える
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 に答える
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 に答える