Джанго Чарфилд составляет значение по умолчанию - PullRequest
1 голос
/ 16 февраля 2011

Как добавить составное значение по умолчанию в поле char?

Пример

class Myclass (xxx):

type = models.ForeignKey(somewhere)
code = models.CharField(default=("current id of MyClass wich is autoincremented + type value"))

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

Ответы [ 3 ]

2 голосов
/ 16 февраля 2011

Вы должны переопределить метод сохранения, как предлагает Лакшман, однако, поскольку это значение по умолчанию, а не пусто = False, код должен немного отличаться:

Class MyClass(models.Model):
...
def save(self):
    if not self.id:
        self.code = str(self.id) + str(self.type_id)
    return super(Myclass,self).save())
2 голосов
/ 16 февраля 2011

Для этого вы переопределяете метод сохранения в вашей модели.

class MyClass(models.Model):
    ...

    def save(self):
        super(Myclass,self).save()
        if not self.code:
            self.code = str(self.id) + str(self.type_id)
            self.save()

Есть вещи, о которых вам нужно позаботиться, например, сделать код пустым полем, но вы поняли идею.

0 голосов
/ 17 февраля 2011

Вы также можете использовать сигнал post_save

from django.db.models import signals

class MyClass(models.Model):
    type = models.ForeignKey(somewhere)
    code = models.CharField(blank=True)

def set_code_post(instance, created, **kwargs):
    instance.code = str(instance.id) + str(instance.type_id)
    instance.save()

signals.post_save.connect(set_code_post, sender=MyClass)

Или, если на то пошло, вы можете использовать комбинацию сигналов pre_save и post_save, чтобы избежать двойного запуска save () ...

from django.db.models import signals

class MyClass(models.Model):
    type = models.ForeignKey(somewhere)
    code = models.CharField(blank=True)

def set_code_pre(instance, **kwargs):
    if hasattr(instance, 'id'):
        instance.code = str(instance.id) + str(instance.type_id)

def set_code_post(instance, created, **kwargs):
    if created:
        instance.code = str(instance.id) + str(instance.type_id)
        instance.save()

signals.pre_save.connect(set_code_pre, sender=MyClass)
signals.post_save.connect(set_code_post, sender=MyClass)
...