如何在pre_save Django中连接模型字段值

时间:2018-06-10 07:51:27

标签: django django-models

我不知道如何提出这个问题所以请耐心等待。

这是我的问题:

我有两个模型FooBar。以下是models.py

class Foo(models.Model):
    foo_code = models.CharField(max_length=12, blank=True, null=True)


class Bar(models.Model):
    foo_rel = models.ForeignKey(Foo)
    bar_code = models.CharField(max_length=12, blank=True, null=True)

现在,foo_code让我说123456然后当我创建新的Bar实例时,我希望bar_code{{foo_code}}-{{id of Bar}},即{{1} }}

我无法绕道而行。我想过使用123456-01 / pre_save,却想不到逻辑。请帮忙!

编辑:将FK添加到post_save

1 个答案:

答案 0 :(得分:1)

您可以覆盖保存方法:

class Bar(models.Model):
    foo_rel = models.ForeignKey(Foo)
    bar_code = models.CharField(max_length=12, blank=True, null=True)

    def save(self, *args, **kwargs):
        if self.bar_code and len(self.bar_code.split('-')) > 1:
            # Do update the Bar instance, need remove old previx first
            self.bar_code = self.bar_code.split('-')[1]
        self.bar_code = '{}-{}'.format(self.foo_rel.foo_code, self.bar_code)
        super(Bar, self).save(*args, **kwargs)

这将如下工作:

>>> f = Foo.objects.create(foo_code='123456')
>>> b = Bar.objects.create(foo_rel=f, bar_code='01')
>>> b.bar_code
u'123456-01'
>>> b.bar_code = '03'
>>> b.save()
>>> b.bar_code
u'123456-03'
>>> f.foo_code = '4567'
>>> f.save()
>>> b.save()
>>> b.bar_code
u'4567-03'

它看起来不错,但您应该记住它不适用于批量update

>>> Bar.objects.update(bar_code='333')
1
>>> b.refresh_from_db()
>>> b.bar_code
u'333'