Как хранить классы Python в базе данных с Django? - PullRequest
2 голосов
/ 06 февраля 2010

У меня есть два файла:

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 ]

4 голосов
/ 06 февраля 2010

Вы можете использовать pickle для хранения экземпляров классов, но тогда это будет уродливее, и вам не нужно для хранения классов в базе данных в этом случае, так что нея хочу избежать как можно большего попадания в базу данных).

Чтобы не повторять идентификаторы в двух местах, вы можете изменить код на что-то вроде этого:

выбор.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())
0 голосов
/ 06 февраля 2010

Какое значение имеют классы SomeChoice и AnotherChoice?Почему бы просто не хранить ключи и значения в словаре (вид ссылки CHOICES в SomeModel) и иметь один новый класс, который просто представляет выбор,

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

, и тогда вы получите ту же функциональность, что и SomeChoice.и AnotherChoice, но если вы добавите больше вариантов, вам не нужно больше классов.Возможно, ваш пример был слишком упрощен, но я не вижу значения этих классов.Извините, если я полностью упустил суть.

...