0

私の中にこのようなものがある場合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)

ユーザーが購読ボタンをクリックすると、コールバックが呼び出され、ユーザーが現在閲覧している雑誌の購読テーブルに挿入されます。

subscribe テーブルに購読者と雑誌の一意の組み合わせを含めるにはどうすればよいですか? 雑誌を購読した購読者は、同じ雑誌を再度購読することはできません。

たとえば、これはうまくいくはずです:

ユーザー 1、マガジン 1
ユーザー 1、マガジン 2
ユーザー 2、マガジン 1

しかし、これはすべきではありません:

ユーザー 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()ましたが、フォームの使用に制限されているようです? このスレッドは、それが機能しないことも示唆しています。

4

1 に答える 1