Arvine
(白菜)
1
Todoism项目中单元测试的代码,只对user对象进行了add()操作,item却没有。
同样在后面的代码中item都没有add()操作,请问是什么?
位置:test_api.py
def setUp(self):
app = create_app('testing')
self.app_context = app.test_request_context()
self.app_context.push()
db.create_all()
self.client = app.test_client()
user = User(username='grey')
user.set_password('123')
item = Item(body='Test Item11111', author=user)
user2 = User(username='li')
user2.set_password('456')
item2 = Item(body='Test Item 2222222', author=user2)
db.session.add(user)
db.session.add(user2)
db.session.commit()
def test_get_items(self):
user = User.query.get(1)
item2 = Item(body='Test Item 2', author=user)
item3 = Item(body='Test Item 3', author=user)
item4 = Item(body='Test Item 4', author=user, done=True)
db.session.commit()
根据我经验和猜测
item = Item(body='Test Item11111', author=user)
等价于
Item(body='Test Item11111')
user.items.append(item)
即:
def setUp(self):
app = create_app('testing')
self.app_context = app.test_request_context()
self.app_context.push()
db.create_all()
self.client = app.test_client()
user = User(username='grey')
user.set_password('123')
#item = Item(body='Test Item11111', author=user)
# 等价于
item = Item(body='Test Item11111')
user.items.append(item)
user2 = User(username='li')
user2.set_password('456')
#item2 = Item(body='Test Item 2222222', author=user2)
# 等价于
item2 = Item(body='Test Item 2222222')
user2.items.append(item2)
db.session.add(user)
db.session.add(user2)
db.session.commit()
另外,这个应该和书本「5.7.1 级联操作」小节的知识点有关。
1 个赞
greyli
(Grey Li)
4
你是不是把第 5 章跳过了?因为书没在手边,就从书稿里复制了一份对应章节的内容,如下:
5.7.1 级联操作
save-update
save-update是默认的级联行为,当cascade参数设为save-update时,如果使用db.session.add()方法将Post对象添加到数据库会话时,那么与Post相关联的Comment对象也将被添加到数据库会话。我们首先创建一个Post对象和两个Comment对象:
>>> post1 = Post()
>>> comment1 =Comment()
>>> comment2 =Comment()
将post1添加到数据库会话后,只有post1在数据库会话中:
>>> db.session.add(post1)
>>> post1 in db.session
True
>>> comment1 in db.session
False
>>> comment2 in db.session
False
如果我们让post1与这两个Comment对象建立关系,那么这两个Comment对象也会自动被添加到数据库会话中:
>>> post1.comments.append(comment1)
>>> post1.comments.append(comment2)
>>> comment1 in db.session
True
>>> comment2 in db.session
True
当调用db.session.commit()提交数据库会话时,这三个对象都会被提交到数据库中。
Arvine
(白菜)
5