如何将 post_save 接收器与 django-polymorphic 一起使用?

问题描述 投票:0回答:2

我有一个

django-polymorphic
模型,想要实现
post_save
信号来自动创建一个也是多态的相关模型。

类似于下面的代码,相关的非工作代码是

@receiver
修饰的
work_post_save
方法。问题是实例是 ctype_id 而不是对象。

from django.db import models
from django.db.models import signals
from django.dispatch import receiver
from polymorphic.models import PolymorphicModel

from mygallery.models import Album

# Work Parent PolymorphicModel
class Work(PolymorphicModel):
    title = models.CharField(blank=True,max_length=256)
    slug = models.SlugField(max_length=256)

@receiver(signals.post_save, sender=Work)
def work_post_save(sender, instance, signal, created, **kwargs):
    album, new = Album.objects.get_or_create(title=instance.title + ' Stills', slug=instance.slug + '-stills')
    work_album, new = WorkAlbum.objects.get_or_create(work=instance, album=album, is_key=True)


class ArtProject(Work):
    manifesto = models.CharField(blank=True,max_length=256)

class CodeProject(Work):
    code = models.CharField(blank=True,max_length=256)


# Content Parent PolymorphicModel
class WorkContent(PolymorphicModel):
    is_key = models.BooleanField(default=False, unique=True, default=False)


class WorkAlbum(WorkContent):
    work = models.ForeignKey(Work, related_name='work_albums')
    album = models.ForeignKey(Album, related_name='album_works')
python django polymorphism
2个回答
2
投票

我只是摆弄了一下这个问题,所以我不能100%确定处理这个问题的正确方法是什么。

我最终做的是

sender
注释中声明
@receiver
。这具有回调由每个
post_save
信号触发的效果。然后在回调中,我检查
isinstance()
与我的父模型(在您的情况下为
Work
),以便回调仅在保存我感兴趣的模型后执行。执行回调时,
instance
参数是子模型(在您的情况下为
ArtProject
CodeProject
)。

@receiver(signals.post_save)
def work_post_save(sender, instance, signal, created, **kwargs):
    if isinstance(instance, Work):
        # instance is either ArtProject or CodeProject
        album, new = Album.objects.get_or_create(title=instance.title + ' Stills', slug=instance.slug + '-stills')
        work_album, new = WorkAlbum.objects.get_or_create(work=instance, album=album, is_key=True)

直接在父级上触发

save()
显然不支持


0
投票

@receiver
装饰器支持多种模型。当给定发件人列表或元组时,它将单独连接到每个发件人。要获取子类列表,我们可以使用
__subclasses__
方法。

@receiver(post_save, sender=Work.__subclasses__())
def work_post_save(sender, instance, created, **kwargs):
    album, new = Album.objects.get_or_create(title=instance.title + ' Stills', slug=instance.slug + '-stills')
    work_album, new = WorkAlbum.objects.get_or_create(work=instance, album=album, is_key=True)

请注意,

__subclasses__
不包括基类本身,也不包括任何嵌套子类。如果需要,您可能需要实现一些自定义逻辑来列出您需要的具体模型。

© www.soinside.com 2019 - 2024. All rights reserved.