2013-06-20 7 views
1

В настоящее время я пытаюсь изменить модуль django-podcast, чтобы файл xml подкаста был статически подан вместо того, чтобы сгенерировать его для каждого запроса.Доступ к объектам с отношением внешнего ключа в Django?

Я пытаюсь переписать XML-файл канала каждый раз, когда эпизод изменяется, создается или удаляется, и для этого я использую django signals. То, что я хотел бы сделать что-то вроде этого ...

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 в качестве первичного ключа, как это ...

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

, но, по-видимому sender.pk возвращает property object, а не целое число или строку, и я не знаю, как получить его значение, поэтому я думаю, у меня есть два вопроса.

Как я могу получить экземпляр Show, связанный с Episode? и что это за черт property object и почему sender.pk возвращает его?

Спасибо заранее за ваш ответ!

Джош

+0

Почему для этого не используется кеш Django? –

ответ

1

Вы можете попробовать:

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 модели.

+2

Чтобы попытаться объяснить вещи более подробно: 'sender' на самом деле является классом' Episode', а 'instance' является экземпляром класса' Episode', к которому OP хочет получить доступ. –

+0

Огромное вам спасибо, это была моя проблема! Я ценю помощь! – midimaster21b

0

Я, наконец, понял! Эта проблема была связана с моим недостатком знаний о аргументах, отправляемых моему обработчику сигналов.

Аргумент sender, отправленный моему обработчику, фактически был объектом класса, а не самим экземпляром. Для того, чтобы восстановить сам экземпляр мне нужно использовать kwargs['instance'] и для того, чтобы восстановить экземпляр Show я просто использовал kwargs['instance'].show

В результате, я думаю, я понимаю, где property object вопрос откуда. Исправьте меня, если я ошибаюсь, но при попытке доступа к объекту «class» вместо объекта «экземпляр класса» свойства не определяются как строковые или целочисленные значения, а скорее объекты свойств, которые необходимо определить.

Также в качестве дополнительной заметки функция signal.connect() не должна определяться в модели класса, и способ, описанный выше, несколько обманывает. Способ, которым он соединен выше, будет прослушивать отправляемый сигнал сохранения или удаления любого объекта. Для того, чтобы связать функцию с сигналом от только Episode объектов я должен был бы написать как ...

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

или с помощью декоратора, как показано на Django's signal documentation.

Еще раз спасибо за помощь!

Josh

 Смежные вопросы

  • Нет связанных вопросов^_^