1

所以我在 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 有这个问题,因为它应该为你跟踪所有这些问题。

4

1 回答 1

0

我注意到的第一件事是,您有两个模型从其他类继承并添加自己的字段,但它们使用相同的db_column. 实现此目的的一种更简洁的方法(如果您不直接使用main_menu)是使用Abstract Base Class

实际上,您的language2模型具有以下字段:

    _path1 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True)
    _path2 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True)
    _path3 = models.CharField(db_column='path', max_length=Global.MAX_FILE_PATH_LENGTH, unique=True)
    main_menu_blah = models.CharField(max_length=30, default='')
    language_blah = models.CharField(max_length=30, default='')
    language_blah2 = models.CharField(max_length=30, default='')

此外,Python 不需要在每条语句的末尾使用分号。

于 2013-02-28T00:20:43.970 回答