Django-为“创建外键”;至“U字段”;如果不存在

Django-为“创建外键”;至“U字段”;如果不存在,django,save,Django,Save,我有两个型号(+2个不重要) 支持链接自定义save方法在create和update上自动创建kod,保持kod不变 在创建Lead时,如果链接不存在,我希望自动创建链接。最好的方法是什么 这是我第二天在用foreignkey定制保存方法时寻找最佳方法,但我缺乏想法 class Link(models.Model): landing = models.ForeignKey(Landing, default=1, on_delete=models.PROTECT) partner

我有两个型号(+2个不重要)

支持链接自定义
save
方法在
create
update
上自动创建
kod
,保持
kod
不变

在创建Lead时,如果链接不存在,我希望自动创建链接。最好的方法是什么

这是我第二天在用foreignkey定制保存方法时寻找最佳方法,但我缺乏想法

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:关系“appname\u models\u link”不存在 第1行:…ls_link“.”opis“,”appname_models_link“,”created“FROM”appname_model


使用自定义保存方法确实是实现这一点的最佳方法。 你也可以使用信号,但这往往更难维持

使这个“更干净”的一种方法是创建模型类可以从中继承的混合。 如果你担心的话,你也可以定义kwargs的哪种行为。根据您的需求,您的restapi可能是一个处理这个问题的地方,但大多数情况下,我会使用您已经使用过的东西

你是说这个

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)

使用自定义保存方法确实是实现这一点的最佳方法。 你也可以使用信号,但这往往更难维持

使这个“更干净”的一种方法是创建模型类可以从中继承的混合。 如果你担心的话,你也可以定义kwargs的哪种行为。根据您的需求,您的restapi可能是一个处理这个问题的地方,但大多数情况下,我会使用您已经使用过的东西

你是说这个

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)

将此方法添加到潜在客户类别下面:

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

我希望我能有所帮助

在你的潜在客户课程下面添加此方法:

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

我希望我能帮上忙

django.db.models.fields.related_描述符.relatedObjectsDoesNotExist:Lead没有链接。奇怪的“bug”,通常,您可以访问leadObj.link,它应该返回None,但它会在self.link中抛出该错误。link为None,因此我现在使用hasattr,它正在运行django.db.models.fields.related_descriptor.relatedObjectsDoesNotExist:Lead没有链接。奇怪的“bug”,正常情况下,您可以访问leadObj.link,它应该返回None,但它会在self处抛出错误。link为None,因此我现在使用hasattr,它正在工作它也不工作,django.db.models.fields.related_descriptor.RelatedObjectDoe‌​sNotExist:Lead没有链接它也不工作,django.db.models.fields.related_descriptor.RelatedObjectDoe‌​势利主义者:线索没有联系