我有两个文件:
choices.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类存储到数据库中的最佳方法是什么?
请原谅我丑陋的英语。如果您需要更多信息,请告诉我。 ; - )
答案 0 :(得分:4)
你可以使用pickle来存储类的实例,但是它会更加丑陋,在这种情况下你不需要需要来将类存储在数据库中,所以不要(你想避免尽可能多地访问数据库。)
为避免在两个地方重复ID,您可以将代码更改为:
<强> choices.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())
答案 1 :(得分:0)
SomeChoice和AnotherChoice课程的价值是多少?为什么不将键和值存储在字典中(在SomeModel中使用某种链接CHOICES)并且只有一个新类可以代表一个选择,
class UserChoice:
def __init__(self, id, name):
self.id = id
self.name = name
然后您将获得与SomeChoice和AnotherChoice相同的功能,但如果添加更多选项,则不需要更多类。也许你的例子过于简单,但我没有看到这些类的价值。对不起,如果我完全错过了这一点。