Как заранее заполнить удостоверение личности в Джанго - PullRequest
0 голосов
/ 31 октября 2009

У меня есть простая модель вопроса:

class Question(Polymorph):
    text = models.CharField(max_length=256)
    poll = models.ForeignKey(Poll)
    index = models.IntegerField()

И я хотел бы предварительно заполнить (при сохранении) поле индекса значением ID.Конечно, перед сохранением у меня нет значения идентификатора (оно создается после него), поэтому мне интересно, как проще всего это сделать?Есть идеи?

Я думаю о django-signal, но тогда мне придется дважды вызывать метод save ().

Ответы [ 3 ]

5 голосов
/ 31 октября 2009

Как бы вы ни делали, вам придется дважды позвонить в save. Идентификатор генерируется непосредственно сервером базы данных (за исключением sqlite, я полагаю), когда новая строка вставлена, поэтому вам придется делать это в любом случае.

Я бы спросил, действительно ли вам нужно иметь значение ID в вашем поле index. В конце концов, он всегда доступен как obj.id, поэтому, даже если вы хотите, чтобы оно было частью более длинного значения, вы всегда можете рассчитать его динамически через свойство.

0 голосов
/ 04 ноября 2009

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

0 голосов
/ 03 ноября 2009

Да, попытка определить следующий идентификатор откуда-то не будет переносимой. Еще проще, чем использовать сигналы, добавить что-то подобное в ваш метод сохранения:

def save(self, *args, **kwargs):
    """Save method for Question model"""
    if not self.id:
        super(Question, self).save(*args, **kwargs)
    # Fill the index field
    self.index = self.id # plus whatever else you need
    return super(Question, self).save(*args, **kwargs)

Полагаю, вам придется пойти по этому пути, если вы не можете полностью получить идентификатор объекта из строки, которую вы получаете в качестве входных данных для фильтра. Но если ваша строка где-нибудь "{id} -something-else", то было бы лучше избавиться от поля индекса и извлечь значение id из строки с помощью регулярного выражения, а затем отфильтровать непосредственно по id с помощью Questions.objects. фильтр (ID = ID)

...