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 方法可以在链中处理这种父子对象的创建?
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)
在 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_save将Parent与创建所有子项的函数连接起来。
| 归档时间: |
|
| 查看次数: |
4111 次 |
| 最近记录: |