【问题标题】:Django primary key error (Djongo driver)Django主键错误(Djongo驱动)
【发布时间】:2017-09-04 03:32:39
【问题描述】:

我正在使用 MongoDB 和 Djongo(将 Mongo 与 Django 连接)在 Python、Django 上编写一个网站,我希望能够使用我的网站从数据库中添加和删除文档。但我在执行此操作时出错。

如果我没有在我的模型中设置主键,那么我可以成功添加文档,但是当尝试删除时出现 AssertionError(无法删除对象,因为它的 id 属性设置为 None),但是当我检查数据库_ID 字段是自动创建的。如果我在 models.py 中通过primary_key = True 设置主键,我可以成功删除一个文档,但在插入时我得到了 AssertionError(未提供异常消息)。

另外,如果没有设置主键,那么我无法从管理面板访问文档,但可以将它们添加到数据库中(通过管理面板);如果设置了 pk,那么我可以从管理面板访问、删除和编辑,但不能将新文档添加到数据库中。

这是我的模型:

class DevList(models.Model):
    dev_num = models.CharField(max_length = 200 , primary_key = True)
    dev_name = models.CharField(max_length = 200)
    dev_descr = models.CharField(max_length = 200)
    dev_type = models.CharField(max_length = 200)

如果没有设置pk,那么我删除primary_key = True这一行

我的视图是简单的帖子形式,我使用d.save() 保存并使用d.delete() 删除。

【问题讨论】:

  • 想知道您是否找到了答案。我也在为同样的事情苦苦挣扎。

标签: python django mongodb djongo


【解决方案1】:

实际上,Django 默认为每个模型提供一个id 字段,默认设置为primary key

现在,当您可以通过primary_key=True 将其他字段设置为主键时。但为了更流畅的操作,我建议您在其他字段上使用unique=True

dev_num = models.CharField(max_length = 200 , unique = True)

【讨论】:

  • 在我的情况下,似乎没有 Django id 字段(否则我不会得到错误)。也许它被 MongoDB _id 字段覆盖,但它导致 Django 看不到 id(或将 id 设置为 None,我不确定)。因此,如果我不明确设置 Primary_key,Django 管理面板根本看不到任何 id。添加唯一性也无济于事,仍然出现相同的错误。
  • 这不应该发生,但让我看看是不是这样。
  • @Shepherd 我也有同样的错误,你能解决吗?
【解决方案2】:

我在使用 MongoDB + Django 和 Djongo 驱动程序时遇到了类似的问题(无法删除我网站管理页面中的对象,因为 _id 不是整数,而是 ObjectID() 不能被识别为有效整数)。

这就是我解决它的方法(最快的方法): 我为我的对象设置了一个带有 models.PositiveIntegerField 类型的 id,并且我使用了具有 True 值的 primary_key 参数):

class MyObject(models.Model):
    id = models.PositiveIntegerField(primary_key=True)
    title = models.CharField(max_length=100)
    other_field = models.TextField(blank=True)

    def __str__(self):
        return f"{self.title}"

这样,mongoDB 的 _id 没有被使用,但是管理系统仍然为主键找到一个有效的整数。测试成功,问题解决。

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2020-04-14
    • 2017-11-05
    • 1970-01-01
    • 2019-01-27
    • 2016-10-27
    相关资源
    最近更新 更多