【问题标题】:django objects.all queryset doesn't return all objects from databasedjango objects.all 查询集不返回数据库中的所有对象
【发布时间】:2013-02-28 00:07:43
【问题描述】:

所以我在 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”等),但问题是仍然存在。最令人困惑的部分是原始查询有效,并且重新启动服务器会修复它(直到插入新行,然后看不到最后一行)。

编辑2: 所以我发现了发生了什么。我忘记了重要的事情是每张桌子是如何绑在一起的。

如果我有一个基类: A类

一个子类: B类(A)

另一个子类: C类(B)

我有这样链接的表格:

A -> B -> C

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

第 1 行 A:姓名 =“杰拉德”-> B:年龄 =“25” -> C:性别 =“男性” 第 2 行 A: Name="Janet" -> B: Age="24" -> C: Gender="Female"

如果删除表 B 中的第二行,则指向表 C 的链接会中断。 所以我基本上砍掉了班上的躯干。 1/3 的数据丢失。因此,django 将其报告为不存在。

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

【问题讨论】:

    标签: django row django-queryset


    【解决方案1】:

    我注意到的第一件事是,您有两个模型从其他类继承并添加了自己的字段,但它们使用相同的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 不需要在每条语句的末尾使用分号。

    【讨论】:

      猜你喜欢
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多