4

我有两个文件:

选择.py

class SomeChoice:
    name = u"lorem"

class AnotherChoice:
    name = u"ipsum"

# etc...

模型.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,您可以将代码更改为以下内容:

选择.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)

模型.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)并拥有一个仅代表选择的新类,

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

然后您将获得与 SomeChoice 和 AnotherChoice 相同的功能,但如果您添加更多选择,则不需要更多类。也许您的示例过于简单,但我看不到这些类的价值。抱歉,如果我完全错过了重点。

于 2010-02-06T15:01:32.383 回答