1

Elixir で sqlalchemy を使用していますが、クエリを作成しようとすると問題が発生します。

多対多の関係を持つ Customer と CustomerList の 2 つのエンティティがあります。

customer_lists_customers_table = Table('customer_lists_customers', 
                      metadata,
                      Column('id', Integer, primary_key=True),
                      Column('customer_list_id', Integer, ForeignKey("customer_lists.id")),
                      Column('customer_id', Integer, ForeignKey("customers.id")))

class Customer(Entity):
  [...]
  customer_lists = ManyToMany('CustomerList', table=customer_lists_customers_table)

class CustomerList(Entity):
  [...]

  customers = ManyToMany('Customer', table=customer_lists_customers_table)

私はいくつかの顧客で CustomerList を見つけようとしています:

customer = [...]
CustomerList.query.filter_by(customers.contains(customer)).all()

しかし、エラーが発生します: NameError:

グローバル名「customers」が定義されていません

顧客はエンティティ フィールドとは無関係のようですが、リレーションシップ (または ManyToMany リレーションシップ) を操作するための特別なクエリ フォームがありますか?

ありがとう

4

3 に答える 3

1

通常のフィルターを使用できます:query.filter(CustomerList.customers.contains(customer))。その他の例については、SQLAlchemyのドキュメントを参照してください。これは実際にはfilter_byであり、これは特殊なケースです。query.filter_by(**kwargs)省略形は、単純な同等性の比較に対してのみ機能します。カバーの下で、query.filter_by(foo="bar", baz=42)に相当するものに委任されquery.filter(and_(MyClass.foo == "bar", MyClass.baz == 42))ます。(実際には、多くのエンティティがあることを意味するプロパティを把握するための魔法が少しありますが、それでも単純な委任を使用します)

于 2010-05-11T16:02:56.483 に答える
1

エラー メッセージを注意して読んでください。問題の原因を示しています。ということ CustomerList.query.filter_by(CustomerList.customers.contains(customer)).all()ですか?

更新: 宣言的定義を使用する場合、クラススコープで定義された関係のみを使用できますが、これらのプロパティはクラス外では表示されません。

class MyClass(object):
    prop1 = 'somevalue'
    prop2 = prop1.upper() # prop1 is visible here

val2 = MyClass.prop1 # This is OK    

val1 = prop1.lower() # And this will raise NameError, since there is no 
                     # variable `prop1` is global scope
于 2010-05-11T12:18:21.587 に答える
0

CustomerList.query.filter_by(CustomerList.customers.contains(customer)).all()正常に動作するはずです。

于 2010-05-11T12:20:40.090 に答える