Существует ли простой способ создания производных атрибутов в классах Django Model / Python? - PullRequest
4 голосов
/ 26 октября 2009

Каждая модель Django имеет первичный ключ по умолчанию id, созданный автоматически. Я хочу, чтобы объекты модели имели другой атрибут big_id, который рассчитывается как:
big_id = id * SOME_CONSTANT

Я хочу получить доступ к big_id как model_obj.big_id без соответствующей таблицы базы данных, имеющей столбец с именем big_id.

Возможно ли это?

Ответы [ 3 ]

8 голосов
/ 26 октября 2009

Ну, экземпляры модели django - это просто объекты python, или мне все равно сказали: P

Вот как бы я это сделал:

class MyModel(models.Model):
    CONSTANT = 1234
    id = models.AutoField(primary_key=True) # not really needed, but hey

    @property
    def big_id(self):
        return self.pk * MyModel.CONSTANT

Очевидно, вы получите исключение, если попытаетесь сделать это с несохраненной моделью. Вы также можете предварительно рассчитать значение big_id вместо того, чтобы вычислять его каждый раз, когда к нему обращаются.

1 голос
/ 26 октября 2009
class Person(models.Model):
    x = 5
    name = ..
    email = ..
    def _get_y(self):
        if self.id:
            return x * self.id        
        return None
    y = property(_get_y)  
0 голосов
/ 26 октября 2009

У вас есть два варианта, о которых я могу подумать прямо сейчас:

  1. Поскольку вам не нужно поле в базе данных, лучше всего определить метод в модели, который возвращает self.id * SOME_CONSTANT, скажем, вы называете его big_id (). Вы можете получить доступ к этому методу в любое время как yourObj.big_id (), и он будет доступен в шаблонах как yourObj.big_id (вы можете прочитать о «волшебной точке» в шаблонах django).
  2. Если вы не возражаете против того, что он находится в БД, вы можете переопределить метод save для вашего объекта, чтобы вычислить id * SOME_CONSTANT и сохранить его в поле big_id. Это избавит вас от необходимости вычислять его каждый раз, так как я предполагаю, что ID не изменится
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...