Django - 在创建父对象时创建所有外键对象

Eri*_*Kim 3 django django-models

考虑以下代码,其中我有一个父模型,以及通过ForeignKey关系与父模型相关的所有子模型。每个孩子都可能有自己的孩子,让整个家庭看起来像一个树形结构。

class Parent(models.Model):
    field = models.CharField(max_length=100, primary_key=True)

class Child_1(models.Model):
    parent = models.ForeignKey(Parent, models.CASCADE, related_name='aa')

class Child_2(models.Model):
    parent = models.ForeignKey(Parent, models.CASCADE, related_name='aa')

class Child_1_Child_1(models.Model):
    parent = models.ForeignKey(Child_1, models.CASCADE, related_name='aa')

class Child_1_Child_2(models.Model):
    parent = models.ForeignKey(Child_1, models.CASCADE, related_name='aa')
Run Code Online (Sandbox Code Playgroud)

在为 制作对象后Parent,我想创建所有子对象。

我想我可以像这样创建所有子对象:

parent = Parent.objects.create(**kwargs)
child_1 = Child_1.objects.create(parent=parent)
child_2 = Child_2.objects.create(parent=parent)
child_1_child_1 = Child_1_Child_1.objects.create(parent=child_1)
child_1_child_2 = Child_1_Child_2.objects.create(parent=child_1)
...
Run Code Online (Sandbox Code Playgroud)

但是你知道,这看起来不太好。是否有任何内置的 Django 方法可以在链中处理这种父子对象的创建?

JPG*_*JPG 6

save()模型的覆盖方法为,

class Parent(models.Model):
    field = models.CharField(max_length=100, primary_key=True)

    def save(self, *args, **kwargs):
        is_new = not self.pk
        super().save(*args, **kwargs)
        if is_new:
            Child_1.objects.create(parent=self)
            Child_2.objects.create(parent=self)


class Child_1(models.Model):
    parent = models.ForeignKey(Parent, models.CASCADE, related_name='aa')

    def save(self, *args, **kwargs):
        is_new = not self.pk
        super().save(*args, **kwargs)
        if is_new:
            Child_1_Child_1.objects.create(parent=self)


class Child_2(models.Model):
    parent = models.ForeignKey(Parent, models.CASCADE, related_name='aa')

    def save(self, *args, **kwargs):
        is_new = not self.pk
        super().save(*args, **kwargs)
        if is_new:
            Child_1_Child_2.objects.create(parent=self)


class Child_1_Child_1(models.Model):
    parent = models.ForeignKey(Child_1, models.CASCADE, related_name='aa')


class Child_1_Child_2(models.Model):
    parent = models.ForeignKey(Child_1, models.CASCADE, related_name='aa')
Run Code Online (Sandbox Code Playgroud)


C14*_*14L 5

在 Django 中,您通常会为此使用Signals。标准情况是当您创建新的User并希望Profile自动创建它们时。

这个答案的例子:

def create_profile(sender, **kwargs):
    user = kwargs["instance"]
    if kwargs["created"]:
        up = UserProfile(user=user, stuff=1, thing=2)
        up.save()

post_save.connect(create_profile, sender=User)
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,您可以使用post_saveParent与创建所有子项的函数连接起来。