Python 在Django中访问具有外键关系的对象?
我目前正试图修改该模块,使播客的xml文件以静态方式提供,而不是在每次请求时生成 每次修改、创建或删除一集时,我都试图重写频道的xml文件,为此,我正在使用。我想做的是这样的事情Python 在Django中访问具有外键关系的对象?,python,django,foreign-key-relationship,podcast,Python,Django,Foreign Key Relationship,Podcast,我目前正试图修改该模块,使播客的xml文件以静态方式提供,而不是在每次请求时生成 每次修改、创建或删除一集时,我都试图重写频道的xml文件,为此,我正在使用。我想做的是这样的事情 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 =
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)
...
Episode.objects.filter(pk=sender.pk)
我一直遇到的问题是sender.show是一个reversesingrelatedObjectDescriptor
,而不是show类的实际实例。我还尝试使用sender.pk作为主键值重新加载sender对象,如下所示
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)
...
Episode.objects.filter(pk=sender.pk)
但显然sender.pk返回的是一个属性对象,而不是整数或字符串,我不知道如何获取它的值,所以我想我有两个问题
如何检索与剧集
关联的Show
实例?什么是属性对象
,sender.pk为什么返回它
提前感谢您的回复
Josh您可以尝试:
当instance.show.name\u字段
是模型的name\u字段
时 您可以尝试:
当instance.show.name\u字段
是模型的name\u字段
时 我终于明白了!这个问题是因为我对发送给信号处理程序的参数缺乏了解
发送给我的处理程序的sender
参数实际上是一个类对象,而不是实例本身。为了检索实例本身,我需要使用kwargs['instance']
,为了检索Show
实例,我只使用了kwargs['instance']。Show
因此,我想我理解了属性对象
问题的来源。如果我错了,请纠正我,但是当尝试访问“类”对象而不是“类的实例”对象时,属性不是定义为字符串或整数值,而是需要定义的属性对象
另外,还需要注意的是,signal.connect()函数不需要在类的模型中定义,上面编写它的方式有些欺骗性。上面的连接方式将监听任何对象发送的保存或删除信号。为了将函数与仅来自插曲对象的信号相关联,我应该将其写成
post_save.connect(update_xml_file, sender=Episode)
post_delete.connect(update_xml_file, sender=Episode)
或者使用如中所示的装饰器
再次感谢您的帮助
乔希我终于明白了!这个问题是因为我对发送给信号处理程序的参数缺乏了解
发送给我的处理程序的sender
参数实际上是一个类对象,而不是实例本身。为了检索实例本身,我需要使用kwargs['instance']
,为了检索Show
实例,我只使用了kwargs['instance']。Show
因此,我想我理解了属性对象
问题的来源。如果我错了,请纠正我,但是当尝试访问“类”对象而不是“类的实例”对象时,属性不是定义为字符串或整数值,而是需要定义的属性对象
另外,还需要注意的是,signal.connect()函数不需要在类的模型中定义,上面编写它的方式有些欺骗性。上面的连接方式将监听任何对象发送的保存或删除信号。为了将函数与仅来自插曲对象的信号相关联,我应该将其写成
post_save.connect(update_xml_file, sender=Episode)
post_delete.connect(update_xml_file, sender=Episode)
或者使用如中所示的装饰器
再次感谢您的帮助
Josh为什么不使用Django的缓存呢?为什么不使用Django的缓存呢?尝试用更多的细节来解释:sender
实际上是剧集
类,而实例
是OP想要访问的剧集
类的实例。非常感谢,这就是我的问题!我感谢你的帮助!尝试用更多的细节来解释:sender
实际上是插曲
类,而实例
是OP想要访问的插曲
类的实例。非常感谢,这是我的问题!我感谢你的帮助!