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 がReverseSingleRelatedObjectDescriptorShow クラスの実際のインスタンスではなく、実際のインスタンスではないことです。また、次のようにsender.pkを主キー値として使用して送信者オブジェクトをリロードしようとしました...

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

しかしどうやらsender.pkはproperty object整数や文字列ではなくaを返し、その値を取得する方法がわからないので、2つの質問があると思います。

Showに関連付けられているのインスタンスを取得するにはどうすればよいEpisodeですか? そして、一体何ですか、property objectそしてなぜsender.pkはそれを返しますか?

お早めにご回答いただきありがとうございます。

ジョシュ

4

2 に答える 2

0

私はついにそれを理解しました!この問題は、シグナル ハンドラに送信される引数に関する知識が不足していたことが原因でした。

ハンドラーに送信されたsender引数は、実際にはクラス オブジェクトであり、インスタンス自体ではありませんでした。使用する必要のあるインスタンス自体を取得するために、および単に使用kwargs['instance']したインスタンスを取得するためにShowkwargs['instance'].show

property objectその結果、問題がどこから来たのかを理解できたと思います。間違っている場合は訂正してください。ただし、「クラスのインスタンス」オブジェクトではなく「クラス」オブジェクトにアクセスしようとすると、プロパティは文字列または整数値として定義されず、定義する必要があるプロパティ オブジェクトとして定義されます。

また、追加の注意として、クラスのモデルで signal.connect() 関数を定義する必要はなく、上記の記述方法はやや欺瞞的です。上記の接続方法は、送信されたオブジェクトの保存または削除シグナルをリッスンします。関数を Episode オブジェクトのみからのシグナルに関連付けるためには、次のように記述すべきでした...

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

または、 Django の signal documentationに示されているようにデコレータを使用します。

すべての助けをありがとう!

ジョシュ

于 2013-06-20T20:53:39.933 に答える