gpt4 book ai didi

python - 对于从父类继承的模型,Django 不发送 save() 信号?

转载 作者:行者123 更新时间:2023-12-05 06:26:24 24 4
gpt4 key购买 nike

我刚刚在我的模型上设置了继承,这对我的项目来说更有意义——一切都继承自 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")

模型.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()

我什至按照 this thread 堆叠了接收器,以防它应该由父类和子类触发,但它仍然没有保存。

@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(attributes) 创建对象

我是否必须手动编写一些内容才能在之后进入并执行预发布/保存,或者我做错了什么?我看到了 a solution 但这建议将信号发送到所有子类 - 无论哪个 - 但这不是我想要的。我想设置模型特定的 post_save/pre_save 信号而不是一揽子规则。

最佳答案

当我想为所有子模型类添加一个 pre_save 信号但我只想在一个地方实现时,我认为遇到了类似的问题。使用 python 3.6+ 可以解决这个问题,因为它需要 __init_subclass__ 魔法方法。

子模型子类没有自动注册信号的问题。因此,您可以在 init_subclass 函数中为子模型注册信号,而不是手动注册信号

下面的代码示例显示了实现的要点:

Class BaseModel:
common_field = models.CharField(...)

@classmethod
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
# automatically bind the pre_save for the sub model
pre_save.connect(generate_common_field, cls)


def generate_common_field:
pass

Class SubModel(BaseModel):
pass

关于python - 对于从父类继承的模型,Django 不发送 save() 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56147522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com