簡體   English   中英

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM