[英]How to get the list of “objects” from a queryset in a Foreign Key relationship in Django
[英]Accessing objects with a foreign key relationship in Django?
我目前正在嘗試修改django-podcast模塊,以便靜態地提供播客的xml文件,而不是在每次請求時都生成它。
每當嘗試修改,創建或刪除劇集時,我都試圖重寫頻道的xml文件,為此,我使用的是django signal 。 我想做的是這樣的...
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作為主鍵值來重新加載sender對象,如下所示:
Episode.objects.filter(pk=sender.pk)
但是sender.pk顯然返回一個property object
而不是整數或字符串,並且我不知道如何獲取它的值,所以我想我有兩個問題。
如何檢索與Episode
關聯的Show
實例? 什么是property object
,為什么sender.pk返回它?
提前感謝您的回復!
玩笑
你可以試試:
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_field
是模型的name_field
時。
我終於想通了! 該問題是由於我對發送給信號處理程序的參數的了解不足。
發送給我的處理程序的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的信號文檔中所示的裝飾器。
再次感謝您提供的所有幫助!
玩笑
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.