django objects.all queryset不返回数据库中的所有对象

时间:2013-02-28 00:07:43

标签: django row django-queryset

所以我在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;

MAIN_MENU

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 =);

我总是收到以下错误:

DoesNotExist

language2匹配查询不存在。

我查看了数据库(sqlite),我可以看到最后一个条目在_path3列中。

此外,我可以使用原始查询(使用connection.cursor()),我可以得到最后一行。但它只是原始数据,我需要一个模型对象。哦,使用.extra()也没有用。

为什么我不能获得最后一排? (直到我重新启动服务器)

感谢。

编辑: 其他东西需要不同的“_path *”变量,因此抽象基类在我的情况下无济于事,但这是另一个主题。

对于db_column ='path',我有这样的方式,以便原始查询更加简化,我尝试删除它(以便列是“_path1”,“_ path2”等),但问题仍然坚持。最令人困惑的部分是原始查询工作,并重新启动服务器修复它(直到插入新行,然后看不到最后一行)。

EDIT2: 所以我发现了发生了什么。我忘了的重要一点是每个表格是如何捆绑在一起的。

如果我有基类: A级

子类: B类(A)

另一个子类: C类(B)

我有这样的表链接:

A - > B - > ç

假设我在每个表中有2行(每个表示一个类的实例):

第1行A:名称=“杰拉尔德” - > B:年龄=“25” - > C:性别=“男性” 第2行A:名称=“珍妮特” - > B:年龄=“24” - > C:性别=“女性”

如果删除表B中的第二行,则指向表C的链接中断。 所以我基本上切断了班上的躯干。缺少1/3的数据。因此,django报告说它不存在。

因此,请确保在手动删除条目时要小心。你不应该对django有这个问题,因为它应该为你跟踪所有这些。

1 个答案:

答案 0 :(得分: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在每个语句的末尾不需要分号。