1

我目前正在尝试修改django-podcast模块,以便静态提供播客的 xml 文件,而不是在每次请求时生成。

每次修改、创建或删除剧集时,我都会尝试重写频道的 xml 文件,为此我使用django 信号。我想做的是这样的......

from django.db.models.signals import post_save, post_delete
from django.template.loader import render_to_string

def update_xml_file(sender, **kwargs):
    f = open('channelrss.xml', 'w')
    f.write(render_to_string('podcast/show_feed.html', {'object': sender.show}))
    f.close()

class Show(models.Model):
    ...

class Episode(models.Model):
    post_save.connect(update_xml_file)
    post_delete.connect(update_xml_file)
    ...
    show = models.ForeignKey(Show)
    ...

我一直遇到的问题是 sender.show 是一个ReverseSingleRelatedObjectDescriptor而不是 Show 类的实际实例。我还尝试使用 sender.pk 作为主键值重新加载发件人对象,如下所示......

Episode.objects.filter(pk=sender.pk)

但显然 sender.pk 返回 aproperty object而不是整数或字符串,我不知道如何获得它的值,所以我想我有两个问题。

如何检索与Show关联的实例Episode?到底是什么property object,为什么 sender.pk 会返回它?

提前感谢您的回复!

乔什

4

2 回答 2

1

你可以试试:

def update_xml_file(sender, instance=False, **kwargs):
    f = open('channelrss.xml', 'w')
    f.write(render_to_string('podcast/show_feed.html', {'object': instance.show}))
    f.close()

什么时候instance.show.name_fieldname_field模型。

于 2013-06-20T20:46:40.993 回答
0

我终于想通了!这个问题是由于我对发送到我的信号处理程序的参数缺乏了解。

发送给我的处理程序的sender参数实际上是一个类对象,而不是实例本身。为了检索我需要使用的实例本身kwargs['instance'],为了检索Show我简单使用的实例kwargs['instance'].show

结果,我想我明白property object问题出在哪里。如果我错了,请纠正我,但是当尝试访问“类”对象而不是“类的实例”对象时,属性未定义为字符串或整数值,而是需要定义的属性对象。

另外需要注意的是,signal.connect() 函数不需要在类的模型中定义,并且上面的编写方式有些欺骗性。它上面的连接方式将监听发送的任何对象的保存或删除信号。为了将函数与仅来自 Episode 对象的信号相关联,我应该将其编写为...

post_save.connect(update_xml_file, sender=Episode)
post_delete.connect(update_xml_file, sender=Episode)

或者使用Django 的信号文档中所示的装饰器。

再次感谢所有的帮助!

乔什

于 2013-06-20T20:53:39.933 回答