首页 > 解决方案 > 如何在 pre_save Django 中连接模型字段值

问题描述

我不知道如何问这个问题,所以请多多包涵。

这是我的问题:

我有两个模型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}}123456-01

我无法解决问题。我想过使用pre_save/post_save但想不出逻辑。请帮忙!

编辑:将 FK 添加到Foo

标签: djangodjango-models

解决方案


您可以覆盖保存方法:

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'

推荐阅读