我有2个型号(+2不重要)。
自定义save
方法可以自动在kod
创建create
,并update
保持kod
不变。
在创建潜在客户时,我想自动创建链接(如果它不存在)。什么是最好的方法呢?
这是我寻找最佳方法的第二天,当涉及到外国人的自定义保存方法但缺乏想法时。
class Link(models.Model):
landing = models.ForeignKey(Landing, default=1, on_delete=models.PROTECT)
partner = models.ForeignKey(Partner, default=1, on_delete=models.PROTECT)
kod = models.CharField(max_length=16, unique=True, blank=True, null=False)
def save(self, *args, **kwargs):
if self.kod is None:
self.kod = id_generator(16)
if len(self.kod) != 16:
self.kod = id_generator(16)
if self.pk is not None:
current = Link.objects.get(pk=self.pk)
if current.kod != self.kod:
self.kod = current.kod
super(Link, self).save(*args, **kwargs)
class Lead(models.Model):
link = models.ForeignKey(Link, to_field='kod', on_delete=models.PROTECT)
transactionid = models.CharField(max_length=64, blank=True)
**编辑:**使用:
link = models.ForeignKey(Link, to_field='kod', default=Link.objects.get_or_create(kod='autogenerated123')[0], on_delete=models.PROTECT)
运作良好,但前提是有合作伙伴和目标网页:
class Link(models.Model):
landing = models.ForeignKey(Landing, default=1, on_delete=models.PROTECT)
partner = models.ForeignKey(Partner, default=1, on_delete=models.PROTECT)`
django.db.utils.ProgrammingError:relation" appname_models_link"不存在 第1行:... ls_link"。" opis"," appname_models_link"。"创建" FROM" appname_model ...
答案 0 :(得分:0)
使用自定义保存方法确实是实现此目的的最佳方法。 您也可以使用信号,但这往往更难维护。
使这种“更清洁”的一种方法是创建模型类可以继承的mixins。 如果你担心的话,你也可以定义转换那种行为的kwargs。根据您的要求,你的休息api可能是一个处理它的地方,但大多数时候我会用你已经做过的事情。
你是说这个?
class Lead(models.Model):
link = models.ForeignKey(Link, to_field='kod', on_delete=models.PROTECT)
transactionid = models.CharField(max_length=64, blank=True)
def save(self, *args, **kwargs):
if self.pk is None and hasattr(self,'link') is False:
self.link = Link()
self.link.save()
super(Lead, self).save(*args, **kwargs)
答案 1 :(得分:0)
在Lead类下面添加此方法:
class Lead(models.Model):
link = models.ForeignKey(Link, to_field='kod', on_delete=models.PROTECT)
transactionid = models.CharField(max_length=64, blank=True)
@receiver (pre_save, sender=Lead)
def pre_save_handler(sender, instance, **kwargs):
if instance.link is None:
// Create your link here and then...
instance.link = your_link_here
instance.save()
我希望我有所帮助