Django не отправляет сигналы на save () для моделей, наследуемых от родительского класса? - PullRequest
0 голосов
/ 15 мая 2019

Я только что установил наследование на моих моделях, это гораздо лучше подходит для моего проекта - все наследуется от класса 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, а не общее правило.

...