我正在试验 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.id
是odm.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/