Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中访问具有外键关系的对象?_Python_Django_Foreign Key Relationship_Podcast - Fatal编程技术网

Python 在Django中访问具有外键关系的对象?

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 =

我目前正试图修改该模块,使播客的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 = 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想要访问的
插曲
类的实例。非常感谢,这是我的问题!我感谢你的帮助!