I've just setup inheritance on my models, this makes much better sense for my project - everything inherits from Item class, with common elements. Then additional fields are added to child classes - Video, Podcast, Article etc...
Previously, upon Item.save() I had some pre_save and post_save signals setup which parsed/performed various tasks on my Item model objects.
@receiver(pre_save, sender=Item)
def some_function(sender, instance, *args, **kwargs):
print("I am working")
However, now that my objects are all subclassing from Item, those signals don't seem to be firing.
>Article.objects.get_or_create(title='some title')
@receiver(pre_save, sender=Article)
def some_function(sender, instance, *args, **kwargs):
print("I am not doing anything")
models.py
class Item(models.Model, AdminVideoMixin):
title = models.TextField(max_length=2000)
slug = models.SlugField(max_length=500, default='')
link = models.URLField(max_length=200)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(get_random_string(length=5,allowed_chars='1234567890') + '-' + self.title)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse('curate:item_detail',args=[self.slug])
def __str__(self):
return self.title
class Video(Item):
video_embed = EmbedVideoField(max_length=300)
channel = models.TextField(max_length=500, blank=True
def __str__(self):
return self.title.upper()
class Article(Item):
authors = models.CharField(max_length=10000)
movies = models.TextField(max_length=10000)
def __str__(self):
return self.title.upper()
class Podcast(Item):
authors = models.CharField(max_length=10000)
itune_image = models.CharField(max_length=10000)
owner_name = models.CharField(max_length=10000)
def __str__(self):
return self.title.upper()
class Episode(Item):
authors = models.CharField(max_length=10000)
itune_image = models.CharField(max_length=10000)
owner_name = models.CharField(max_length=10000)
enclosure_url = models.URLField(max_length=2000)
owner = models.ForeignKey(Podcast, on_delete=models.CASCADE,max_length=2000)
class Meta:
pass
def __str__(self):
return self.title.upper()
I even stacked up the recievers as per this thread in case it's supposed to be triggered by the parent class as well as child class, but still it didn't save.
@receiver(post_save, sender=Video)
@receiver(post_save, sender=Item)
@receiver(post_save, sender=Article)
def some_function(sender, instance, *args, **kwargs):
print('This still didn't fire')
Also tried to use post_save.connect(some_function, sender=Article) and I couldn't get signals to fire. I'm creating the objects with get_or_create(attributes)
Will I have to manually write something to go in afterwards and perform pre-post/saves or am I doing something wrong? I saw a solution but this suggest sending the signal to all child classes - no matter which - but this isn't what I want. I'd like to set model specific post_save / pre_save signals rather than a blanket rule.