我正在尝试使用stdnet并且我对应该是一个相对简单的案例提出了挑战。
如果我填充我的模型(见下文<hr>
)而不指定主键的值,我会得到:
stdnet.utils.exceptions.FieldValueError: {"author_id": "' main .book'需要字段'author_id' 。"}
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
在填充模型时需要手动指定值?
我在 Python 2.6.6 和 Debian 6.0(内核 2.6.32-5-amd64)上运行带有 Cython 的stdnet 0.8.2。
工作示例:
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'."}