如何使用Django将python类存储到数据库中?

时间:2010-02-06 14:29:13

标签: python database django django-models storing-information

我有两个文件:

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类存储到数据库中的最佳方法是什么

请原谅我丑陋的英语。如果您需要更多信息,请告诉我。 ; - )

2 个答案:

答案 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相同的功能,但如果添加更多选项,则不需要更多类。也许你的例子过于简单,但我没有看到这些类的价值。对不起,如果我完全错过了这一点。