如果我的中有这样的东西models/db.py
:
db.define_table('magazine', Field('name'), Field('description'))
db.define_table('subscribe', Field('subscriber', db.auth_user), Field('magazine', db.magazine))
并在controller/default.py
:
# subscribe callback from view
@auth.requires_login()
def subscribe():
mag_id = request.args(0, cast=int)
db.subscribe.insert(magazine=mag_id, subscriber=auth.user.id)
用户将单击一个订阅按钮,该按钮应调用回调并将用户插入到他正在查看的当前杂志的订阅表中。
如何使订阅表包含订阅者和杂志的唯一组合?订阅了杂志的订阅者不应再订阅同一杂志。
例如,这应该有效:
用户 1,杂志 1
用户 1,杂志 2
用户 2,杂志 1
但这不应该:
用户 1,杂志 1
用户 1,杂志 1
一种解决方案是手动检查该组合是否已存在于我的控制器中:
def subscribe():
mag_id = request.args(0, cast=int)
subscribed = db(db.subscribe.subscriber==auth.user.id)&(db.subscribe.magazine==mag_id))
if len(subscribed) < 1:
# Do insert
else:
# Do nothing, user is already subscribed.
但是有没有更好的方法(最好是在数据库级别)来做到这一点?我读到 usingIS_NOT_IN_DB()
可以工作,但似乎仅限于使用表单?该线程还表明它不起作用。