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()
Вернуться на верх