Я только что установил наследование на моих моделях, это гораздо лучше подходит для моего проекта - все наследуется от класса Item с общими элементами. Затем в дочерние классы добавляются дополнительные поля - Видео, Подкаст, Статья и т. Д. *
Ранее, после Item.save (), у меня была некоторая настройка сигналов pre_save и post_save, которая анализировала / выполняла различные задачи на моих объектах модели Item.
@receiver(pre_save, sender=Item)
def some_function(sender, instance, *args, **kwargs):
print("I am working")
Однако теперь, когда все мои объекты подклассы от Item, эти сигналы, похоже, не срабатывают.
>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()
Я даже сложил приемники в соответствии с этим потоком на тот случай, если он должен быть запущен родительским классом, а также дочерним классом, но все равно не сохранил.
@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')
Также пытался использовать post_save.connect (some_function, sender = Article), и я не мог получить сигналы на срабатывание. Я создаю объекты с помощью get_or_create (attribute)
Должен ли я написать что-то вручную, чтобы потом войти и выполнить предварительную запись / сохранение, или я делаю что-то не так? Я видел решение , но это предлагает посылать сигнал всем дочерним классам - независимо от того, какие - но это не то, что я хочу. Я бы хотел установить специфичные для модели сигналы post_save / pre_save, а не общее правило.