1

シナリオ

プレイヤーはイベントに参加します。イベントに参加するかどうかの情報を提供する必要があります。

解決すべき問題

特定のイベントに参加する予定がある場合、情報を提供していないプレーヤーを選択したい。

あなたの目標

使用されているテクノロジーの初心者として、以下で私が提案するソリューションの改善のための検証と推奨事項をいただければ幸いです。

解決

テクノロジー: python、postgreSQL、および Pony ORM

Pony ORM のエンティティ モデル:

class Event(db.Entity):
    _table_ = "event"
    start = Required(date)
    players = Set("Attendance")


class Player(db.Entity):
    _table_ = "player"
    first_name = Optional(str)
    last_name = Required(str)
    phone_number = Required(str)
    email = Required(str)
    events = Set("Attendance")


class Attendance(db.Entity):
    _table_ = "attendance"
    event = Required(Event)
    player = Required(Player)
    status = Required(bool)
    PrimaryKey(event, player)

考え:

  1. イベントに参加した場合に情報を提供したプレイヤーのリストを取得する
  2. 1で作成したリストにない選手のリストを取得。

アイデアの現在の実装:

players = select(p for p in Player if p not in select(p for p in Player
                 for a in Attendance if p == a.player and a.event == next_event))
4

1 に答える 1

2

クエリをリファクタリングして、よりシンプルにすることができます。まず、内部クエリの明示的な結合を、属性アクセスによる暗黙Player的な結合に置き換えることができます。Attendance

select(p for p in Player if p not in select(p for p in Player
       for attendance in p.events if attendance.event == next_event))

クエリをさらに単純化するために、式を記述して属性リフティングp.events.eventを使用できます。

select(p for p in Player if p not in select(
       p for p in Player if next_event in p.events.event))

p.events式は一連のAttendanceレコードを返します。Pony では、セット インスタンスがある場合、このセットにはアイテムのすべての属性があり、そのような属性にアクセスすると、対応するアイテム属性のすべての値のセットが取得されます。式の値は、特定のプレイヤーに関連付けられたp.events.eventすべてのオブジェクトのセットになります。Event

クエリを簡素化する次のステップは、ジェネレーターをラムダに置き換えることです。このように、クエリは少し短くなります。

Player.select(lambda p: p not in Player.select(
    lambda p: next_event in p.events.event))

しかし、内部クエリが不要であることに気付き、クエリを次のように書き直せば、最大の単純化を実現できます。

Player.select(lambda p: next_event not in p.events.event)

これは、PonyORM を使用してこのクエリを記述する最も簡潔な方法だと思います

于 2016-09-01T12:36:51.620 に答える