Django - 为" to_field"创建外键。如果不存在

时间:2017-01-13 10:14:22

标签: django save

我有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 ...

2 个答案:

答案 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()

我希望我有所帮助