我不知道如何提出这个问题所以请耐心等待。
这是我的问题:
我有两个模型Foo
和Bar
。以下是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
答案 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'