我想从模型的save方法中触发一个视图函数,以便编写或更新与该实例关联的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导入到具有myModel外键的views.py中,这会导致某种冲突,我收到错误:
ImportError: cannot import name createXML
我想我会以错误的方式进行此操作,在模型和视图之间导入,因为它会抛出导入错误。这样做的正确方法是什么?当然,我可以在models.py中完成所有xml编写功能,避免导入冲突,但这似乎是一种混乱的方法。
答案 0 :(得分:2)
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
,您可以将其导入到模型中。
第三种选择是在save方法本身而不是在模块级别导入XML函数:
def save(self, *args, **kwargs):
from myapp.views import createXML, updateXML
但我认为前两个选项更可取。
答案 1 :(得分:1)
首先,在发布这些排序的问题时,发布或链接到所有相关代码(即MyOtherModel)和完整的追溯非常重要。
导致错误的追溯可以帮助您找出导致该导入错误的原因,这可能与您认为可能与您的问题无关。
第二个问题:那些django观点还是普通函数?视图接受请求(带或不带参数)并应返回Response对象。
通常,操作对象或与对象交互的函数(在本例中为模型)应该是对象内部的函数,所谓的方法,视图应该调用这些方法。
class MyModel(models.Model):
name = models.CharField...
somethingelse = models.TextField...
my_method_to_create_pdf(self):
create_pdf(self.somethingelse)
如果不仅在这里使用create_pdf, 在第三个文件中创建一个lib并在此处导入,但是将任何与模型有关的逻辑作为方法,因为对象应该是自包含的。
在python中使用面向对象编程的快速谷歌链接:http://www.voidspace.org.uk/python/articles/OOP.shtml
欢呼声, 灰