python - redis/stdnet 数据模型回溯

标签 python redis nosql

我正在试验 stdnet我遇到了一个应该相对简单的案例的挑战。

如果我在不指定主键值的情况下填充我的模型(参见下面的 <hr>),我会得到:

stdnet.utils.exceptions.FieldValueError: {"author_id": "Field 'author_id' is required for 'main.book'."}

    author1 = models[Author](name='Jeff Doyle')

但是,为 id 添加一个值使代码工作...

    author1 = models[Author](name='Jeff Doyle', id=1)

Author.idodm.AutoIdField() .由于这是一个分层数据模型,我可能能够理解手动添加 id = odm.AutoIdField() 的要求。到我的模型。但是,文档说 odm.AutoIdField自动生成主键的值。

我的问题:为什么我需要为 id 指定一个值当我填充我的模型时手动?

我在跑 stdnet 0.8.2 w/Cython,基于 Python 2.6.6 和 Debian 6.0(内核 2.6.32-5-amd64)。


工作示例:

from stdnet import odm

class Author(odm.StdModel):
    id = odm.AutoIdField(primary_key=True, unique=True)
    name = odm.SymbolField()

    def __unicode__(self):
        return self.name

class Book(odm.StdModel):
    id = odm.AutoIdField(primary_key=True, unique=True)
    title = odm.CharField()
    author = odm.ForeignKey(Author, related_name='books')

    def __unicode__(self):
        return "<Book '%s' by %s>" % (self.title, self.author)

if __name__=='__main__':
    models = odm.Router('redis://localhost:6379?db=0')
    models.register(Author)
    models.register(Book)

    session = models.session()
    session.begin()
    author1 = models[Author](name='Jeff Doyle', id=1)
    session.add(author1)
    book1 = models[Book](title='Routing TCP/IP, Volume 1', id=2, author=author1)
    session.add(book1)
    session.commit()

回溯:

Traceback (most recent call last):
  File "stdnet_example.py", line 31, in <module>
    session.commit()
...
stdnet.utils.exceptions.FieldValueError: {"author_id": "Field 'author_id' is required for '__main__.book'."}

最佳答案

我认为问题在于您正试图在同一 session 中同时插入书籍和作者。所以在提交时,作者还没有保存到数据库中,因此在外键中没有可供引用的图书 ID。

我认为,如果您在尝试添加图书之前提交作者,应该可以。像这样:

session.begin()
author1 = models[Author](name='Jeff Doyle')
session.add(author1)
session.commit()

session.begin()
book1 = models[Book](title='Routing TCP/IP, Volume 1', author=author1)
session.add(book1)
session.commit()

我看到有人在 GitHub 上提出了一个与您有类似问题的问题,并且有 a response in the comments来自 stdnet 的作者。我认为他基本上和我说的是一样的,但你可以自己读一下。

关于python - redis/stdnet 数据模型回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921994/

相关文章:

java - CouchBase-lite - 无法应用管理器中的上下文

python - 基本的 Python JSON 日期时间转换问题

python - 在旧版 Python 中创建带有可变参数的 Typing.Annotated 实例

python - 在 Windows 上将 Scipy 版本更新到最新版本

c# - 一次调用从 Redis 读取多个哈希值

spring-boot - 在 Aerospike 中更新单个字段的最佳方法

ubuntu - 为什么redis会关闭?

mongodb - 澄清有关 MongoDB 的问题

nosql - 在我的场景中提高 Cassandra 读取性能的方法

python - Py2exe 错误 : [Errno 2] No such file or directory