1

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

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

4

2 回答 2

1

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

现在,当您可以将其他字段设置为主键时primary_key=True。但为了更顺畅的操作,我会建议你 unique=True在其他领域使用。

dev_num = models.CharField(max_length = 200 , unique = True)
于 2017-09-04T03:59:41.993 回答
0

我在使用 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-06-18T13:46:08.390 回答