Импорт функций представления в models.py - запуск через метод сохранения с переопределением - PullRequest
0 голосов
/ 25 марта 2011

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

#models.py
from myapp.views import updateXML, createXML

class myModel(models.Model):

    def save(self, *args, **kwargs):
        if self.pk is not None:
            updateXML(self)
        else:
            createXML(self)
        super(FatherAgendaTemplate, self).save(*args, **kwargs)

#views.py
from myapp.models import otherModel

def createXML(instance):       
    print "create XML"
    print instance

def updateXML(instance):     
    print "update XML"
    print instance

Проблема в том, что мне нужно импортировать otherModel в views.py, который имеет внешний ключ к myModel, и это вызывает некоторый конфликт, и я получаю ошибку:

ImportError: cannot import name createXML

Полагаю, я поступаю неправильно, импортируя между моделями и представлениями, как это, так как это приводит к ошибке импорта. Какой правильный способ сделать это? Конечно, я мог бы выполнять все функции записи xml из файла models.py и избегать конфликтов при импорте, но этот подход кажется грязным.

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Функции createXML и updateXML специфичны для данной конкретной модели? Если это так, как представляется вероятным, то лучше всего сделать их методы на myModel:

class MyModel(models.Model):
    ...fields...


    def createXML(self):
        ... do stuff with self ...

    def save(self, *args, **kwargs):
        if not self.pk:
            self.createXML()

и так далее. Для меня это, безусловно, лучшее решение, и совсем не грязное.

Однако, если это действительно не работает для вас, есть несколько способов избежать проблемы с импортом. Возможно, лучше всего поместить функции XML в третий модуль, например, lib.py, который вы можете импортировать в свои модели.

Третий вариант - импортировать функции XML в самом методе сохранения, а не на уровне модуля:

def save(self, *args, **kwargs):
    from myapp.views import createXML, updateXML

Однако я думаю, что первые два варианта были бы предпочтительнее.

1 голос
/ 25 марта 2011

Прежде всего, при публикации вопроса такого рода, очень важно опубликовать или дать ссылку на весь относительный код (то есть MyOtherModel) и полный возврат.

После отслеживания, приведшего к ошибке, можно выяснить, почему вы получаете эту ошибку ImportError, которая, возможно, не имеет к вам никакого отношения.

Второй вопрос: это взгляды Джанго или обычные функции? Представление принимает запрос (с аргументами или без них) и должно возвращать объект Response.

Как правило, функции, которые работают или взаимодействуют с объектом (в данном случае в вашей модели), должны быть функциями внутри вашего объекта, так называемыми методами, и представления должны вызывать эти методы.

class MyModel(models.Model):
    name = models.CharField...
    somethingelse = models.TextField...

    my_method_to_create_pdf(self):
        create_pdf(self.somethingelse)

если create_pdf используется не только здесь, создайте библиотеку в третьем файле и импортируйте ее здесь, но создайте любую логику, связанную с моделями в качестве методов, поскольку объекты должны быть автономными.

быстрая ссылка Google для объектно-ориентированного программирования на python: http://www.voidspace.org.uk/python/articles/OOP.shtml

ура, пепел

...