无法使用ID查询 - Django MongoDB引擎

0 投票
3 回答
1861 浏览
提问于 2025-04-16 10:57

我正在使用 django-nonreldjango-mongodb-engine

我有一个存储在 PostgreSQL 的 Django 模型:

class Author(models.Model):
    name = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)

我还有一个存储在 MongoDB 的模型:

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    author = models.ForeignKey(Author)

每当我尝试通过作者 ID 来过滤帖子时:

posts = Post.objects.filter(author__id=1)

我就会遇到以下错误:

/usr/local/lib/python2.6/dist-packages/bson/objectid.pyc in __validate(self, oid)
    158                     raise InvalidId("%s is not a valid ObjectId" % oid)
    159             else:
--> 160                 raise InvalidId("%s is not a valid ObjectId" % oid)
    161         else:
    162             raise TypeError("id must be an instance of (str, ObjectId), "

InvalidId: 1 is not a valid ObjectId

In [22]: Post.objects.filter(author__id=1)

有什么想法吗?

3 个回答

-1

这两种数据库引擎是没法混合使用的。最简单的解释就是,MongoDB的主键是类似字符串的对象,而SQL的主键是整数。你不能同时使用这两种类型的主键,只能选择其中一种。

0

可能是:

author = Author.objects.get(pk=1)
posts = author.post_set.all()
2

我觉得“mongo方式”就是把作者的详细信息和所有评论都放在帖子里,使用嵌入文档。对于你这种情况,使用多个相关的集合(表)并不是解决问题的最好方法。

尽量减少外键的使用,直接把数据嵌入进去。我记得MongoEngine有一个Document和EmbeddedDocument的类,你可以从这两个类继承。

你为什么想用mongodb而不是mysql呢?你一定有一个超级大的博客... ;-)

撰写回答