4

私は2つのファイルを持っています:

選択肢.py

class SomeChoice:
    name = u"lorem"

class AnotherChoice:
    name = u"ipsum"

# etc...

models.py

from django.db import models
import choices

class SomeModel(models.Model):
    CHOICES = (
        (1, choices.SomeChoice.name),
        (2, choices.AnotherChoice.name),
        # etc...
    )
    somefield = models.IntegerField('field', choices=CHOICES)

問題:choices.py のクラスには、データベースに格納する主キーのようなものが必要です。ここでは、これらのキー (1、2、...) を手で書いていますが、これは醜いです。

たとえば、私はそれをしたくありません:

class SomeChoice:
    id = 1
    name = "lorem"

class AnotherChoice:
    id = 2
    name = "lorem"

だから私の質問は: Python クラスをデータベースに保存する最良の方法は何ですか?

私の醜い英語を許してください。さらに情報が必要な場合は、教えてください。;-)

4

2 に答える 2

4

pickle を使用してクラスのインスタンスを保存することもできますが、そうすると見苦しくなります。また、この場合、クラスをデータベースに保存する必要がないため、そうしないでください (できるだけデータベースにアクセスしないようにする必要があります)。可能)。

ID が 2 か所で繰り返されるのを避けるために、コードを次のように変更できます。

選択肢.py

_registry = {}

def register(choice_class):
    id = len(_registry) + 1
    choice_class.id = id
    _registry[id] = choice_class

def as_list():
    ret = []
    for id in sorted(_registry):
        ret.append((id, _registry[id].name))
    return ret

def get_choice(id):
    return _registry[id]

class SomeChoice:
    name = u"lorem"

class AnotherChoice:
    name = u"ipsum"

register(SomeChoice)
register(AnotherChoice)

models.py

from django.db import models
import choices

class SomeModel(models.Model):
    somefield = models.IntegerField('field', choices=choices.as_list())
于 2010-02-06T14:56:04.110 に答える
0

SomeChoice クラスと AnotherChoice クラスの値は何ですか? キーと値をディクショナリ (SomeModel のリンク CHOICES のようなもの) に保存して、選択肢を表す新しいクラスを 1 つ作成しないのはなぜですか?

class UserChoice:
    def __init__(self, id, name):
        self.id = id
        self.name = name

そうすると、SomeChoice と AnotherChoice の同じ機能が得られますが、さらに選択肢を追加しても、クラスを増やす必要はありません。あなたの例は単純化しすぎたのかもしれませんが、それらのクラスの価値はわかりません。ポイントを完全に逃した場合は申し訳ありません。

于 2010-02-06T15:01:32.383 に答える