Django Сигналы: Создание экземпляров разных моделей, когда одна создается на основе поля boolean в модели отправителя
У меня есть три модели ProductOrService
, Product
и Service
. У меня есть булево поле is_product
в модели ProductOrService
, которое говорит, что товар является товаром, если оно истинно, и услугой, если оно ложно. Я хочу автоматически создать экземпляр Product
, если поле is_product
равно True
или автоматически создать экземпляр Service
, если поле is_product
равно False
. Приведенный ниже код создает экземпляр Product
, когда создается экземпляр ProductOrService
с полем is_product
, установленным в True. Но он не создает экземпляр Service
, когда новый экземпляр ProductOrService
создается с is_product
, установленным в значение False
.
models.py
:
signals.py
:
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import ProductOrService, Product, Service, Brand
if ProductOrService.is_product:
@receiver(post_save, sender=ProductOrService)
def create_product(sender, instance, created, **kwargs):
if created:
Product.objects.create(product_or_service=instance, show_price=0, brand=Brand.objects.get(name='None'))
@receiver(post_save, sender=ProductOrService)
def save_product(sender, instance, **kwargs):
instance.product.save()
if not ProductOrService.is_product:
@receiver(post_save, sender=ProductOrService)
def create_service(sender, instance, created, **kwargs):
if created:
Service.objects.create(product_or_service=instance)
@receiver(post_save, sender=ProductOrService)
def save_service(sender, instance, **kwargs):
instance.service.save()
apps.py
from django.apps import AppConfig
class InventoryConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'inventory'
def ready(self):
import inventory.signals
При создании экземпляра ProductOrService с параметром is_product, установленным в True, автоматически создается новый экземпляр продукта. Но новый экземпляр услуги не создается автоматически, когда экземпляр ProductOrService создается с параметром is_product, установленным в False. При этом также не возникает никаких ошибок. Как я могу это сделать?