我在Django中编写一个应用程序,旨在检查XML是否存在错误。它解析XML文件中的每一行,创建一个对应于该行的对象(来自一个名为XMLElement的类),检查行是否有错误,生成一个详细说明错误的字符串,然后将其附加到列表中。这是它的作用的代码片段:
try:
self.string_list = kwargs['tag_string'].replace("<", "").replace(">", "").split()
print self.string_list
self.element_name = self.string_list[0]
except (ValueError, IndexError) as e:
self.errors.append("XMLElement {0} contains an error:{1}".format(self.element_name, str(e)))
然后,在完成解析文件之后,调用函数的模型类将所有错误连接成一个字符串,然后创建一个带有该字符串作为关键参数的对象。
print '\n'.join(obj.errors)
err_obj = Errors(errors='\n'.join(obj.errors))
class Errors(models.Model):
errors = models.TextField()
每当我从XMLElement
实例打印错误列表时,都会正确打印错误。但是,当我尝试使用来自django shell的Errors.objects.all()[n].errors
从错误类中打印错误时,它会返回一个空的unicode字符串。不仅如此,它不是保存一个错误对象,而是保存多个,在3到5之间的任何地方。我的代码的哪个部分可能导致这个?
答案 0 :(得分:0)
关于使用save方法的无用答案。不是吗。
根据您的评论进行更新:您的代码中有很多区域可能导致此行为,主要原因可能是因为您覆盖了__init__()
。在Django中非常不鼓励覆盖该方法,因为该框架使用许多方法来初始化不在您控件中的实例,并且还为许多不同的东西初始化模型。如果需要自定义实例创建,请创建自己的create()
类方法。
我在你的代码中看到了很多东西(这更像是关于你如何使用框架的评论而不是其他任何东西)是你在这些事情上非常轻松地使用Model超类你并不像你的XMLElement
课那样坚持:初始化后的回归可能会给框架带来很多问题。
我的解决方案是你应该检查你的算法在框架之外的行为,然后决定你需要持久化什么,占用数据库的空间,然后将你的代码包装在Django类和为了您自己,请停止覆盖(最重要的是,在其他对象中创建其他对象)init方法。
答案 1 :(得分:0)
我终于能够解决这个问题了。做两件事:
我做的第一件事是将XMLElement
类的超类从models.Model
更改为object
。这解决了我的大部分问题。但是,它无法解决我的__init__
类的UserFile
函数创建多个对象的问题。我通过将Errors
对象从UserFile.__init__
创建到views.py
check
的函数来解决此问题