Ако имам нещо подобно в моя 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.
Но има ли по-добър начин (за предпочитане на ниво база данни) да направите това? Четох, че използването на IS_NOT_IN_DB()
може да работи, но изглежда е ограничено до използване на формуляри? Тази тема също предполага, че няма да работи .