4

次の2つのクラスがあります。

class user(Base):
   ....
   id=Column(Integer, primary_key=True)
   address=relationship('Address',backref='user')

class Address(Base):
   ...
   IsItAssgined=False
   user_id=Column(Integer, ForeignKey('user.id'))

これらのクラスの 2 つのインスタンスを作成しましょう。

Addr=Address()
Tom=User()

次の動作が必要です: ユーザーに Addr を追加すると、アドレスのフィールド IsItAssigned が True に更新されます。

Tom.address.append(Addr)
print Addr.IsItAssigned 
-> to be True

可能であれば、ここで記述子を使用する方法がわかりません。

4

1 に答える 1

5

user_idそのためには、列が NULL でないかどうかをテストするプロパティを使用します。Acolumn_property()はここで適切と思われます:

from sqlalchemy.orm import column_property

class Address(Base):
   ...
   user_id = Column(Integer, ForeignKey('user.id'))
   IsItAssigned = column_property(user_id != None)

現在IsItAssignedは または のいずれTrueかになりますFalseまたは、ハイブリッド プロパティを使用します。

from sqlalchemy.ext.hybrid import hybrid_property

class Address(Base):
   ...
   user_id = Column(Integer, ForeignKey('user.id'))

   @hybrid_property
   def IsItAssigned(self):
       return self.user_id != None

ハイブリッド プロパティには、クエリでも使用できるという利点があります。最後になりましたが、この場合、おそらく通常のプロパティでも機能しますが、既に読み込まれているインスタンスでのみ機能します。

class Address(Base):
   ...
   user_id = Column(Integer, ForeignKey('user.id'))

   @property
   def IsItAssigned(self):
       return self.user_id is not None

別の名前を使用しますが。assigned良いかもしれません。Python スタイル ガイド (PEP 8)では、lower_case_with_underscoresfor メソッドとインスタンス属性を推奨しています。

于 2012-12-25T12:22:18.833 に答える