Django: используйте related_name для создания подкласса
Как я могу использовать related_name
для создания дочерней модели, когда создается родительская модель.
from django.db import models
from django.db.models.signals import pre_save, post_save
from django.dispatch import receiver
class Parent(models.Model):
name = models.TextField()
child = models.ForeignKey(Child, on_delete=models.SET_NULL, related_name="parent_child", null=True, blank=True)
def save(self, *args, **kwargs):
super().save()
@receiver(post_save, sender=Parent)
def post_save_receiver(sender, instance, *args, **kwargs)
if not instance.child:
instance.child.parent_child.create(name="I am a child")
class Child(models.Model):
name = models.CharField()
В настоящее время при сохранении я получаю NoneType
ошибку:
'NoneType' object has no attribute 'parent_child'
Вы пытаетесь выполнить действие над NoneType
объектом, например. instance.child
потому что когда вы создаете экземпляр Parent
, вы должны присвоить дочерний объект вашему Parent.child
атрибуту, так что по умолчанию он будет None
, поэтому для присвоения дочернего объекта вашему Parent
классу вы можете поступить следующим образом: вам не нужны сигналы, вы можете сделать это внутри вашего метода сохранения.
class Parent(models.Model):
name = models.TextField()
child = models.ForeignKey(Child, on_delete=models.SET_NULL, related_name="parent_child", null=True, blank=True)
def save(self, *args, **kwargs):
self.child = Child.objects.create(name="I am a child")
super(Parent, self).save(*args, **kwargs)
также вы пытаетесь получить доступ к связанному объекту неправильным способом, если вы находитесь внутри Parent, вы можете получить доступ к дочернему объекту напрямую, используя Parent.child
& если вы хотите получить доступ к Parent
из Child
, вы можете сделать так Child.parent_child
читайте больше о обратной связи
def post_save_receiver(sender, instance, *args, **kwargs)
if not instance.child:
child = Child(name='I am a child').save()
instance.child = child
instance.save()