所以我在 django 中使用继承和以下类:
class main_menu(node):
"""
main_menu(node)
Has no extra fields. All children of the root node must
be main_menu nodes
"""
# Required for tree hierarchy to work (db_column='path' for raw queries)
_path1 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True);
main_menu_blah = models.CharField(max_length=30, default='');
def __unicode__(self):
return self.main_menu_blah;
主菜单
class language(main_menu):
"""
language(main_menu)
Main menu used specifically for a main menu targetted
at a speaker of some language.
"""
# Required for tree hierarchy to work
_path2 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True);
language_blah = models.CharField(max_length=30, default='');
def __unicode__(self):
return self.language_blah;
语
class language2(language):
_path3 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True);
language_blah2 = models.CharField(max_length=30, default='');
现在,我可以插入访问所有这些模型就好了。我也可以使用 .objects.get(...) 来获取它们。
但是,如果我从父类表中删除一行(例如 language2 的父类语言),那么我无法从 language2 表中获取()最后一行。我执行: subNode = language2.objects.get(_path3=);
我总是收到以下错误:
不存在
language2 匹配查询不存在。
我查看了数据库(sqlite),我可以看到最后一个条目在 _path3 列中。
此外,我可以使用原始查询(使用 connection.cursor())并且可以获得最后一行。但这只是原始数据,我需要一个模型对象。哦,使用 .extra() 也没有用。
为什么我不能得到最后一行?(直到我重新启动服务器)
谢谢。
编辑:其他东西需要不同的“_path *”变量,所以抽象基类在我的情况下无济于事,但这是另一个话题。
至于 db_column='path',我采用这种方式,以便更简化原始查询,我尝试删除它(以便列是“_path1”、“_path2”等),但问题仍然存在。最令人困惑的部分是原始查询有效,并且重新启动服务器会修复它(直到插入新行,然后看不到最后一行)。
EDIT2:所以我发现了发生了什么。我忘记的重要一点是每张桌子是如何绑在一起的。
如果我有一个基类:A 类
A小类:B类(A)
另一个子类:C类(B)
我有这样的表链接:
A -> B -> C
假设我在每个表中有 2 行(每行代表一个类的实例):
第 1 行 A:姓名 =“杰拉德”-> B:年龄 =“25”-> C:性别 =“男性”第 2 行 A:姓名 =“珍妮特”-> B:年龄 =“24”-> C:性别="女"
如果删除表 B 中的第二行,则指向表 C 的链接会中断。所以我基本上砍掉了班级的躯干。1/3 的数据丢失。因此,django 将其报告为不存在。
因此,在手动删除条目时请务必小心。你不应该对 django 有这个问题,因为它应该为你跟踪所有这些问题。