2013-06-26 22 views
7

Merhaba, sqlalchemy kullanarak nasıl bir yabancı referans yapmak mümkün değil.sqlkchemy ile bir yabancı dil referansı nasıl oluşturulur

class Client(DeclarativeBase): 

    __tablename__ = 'client' 

    id = Column(Integer, primary_key=True) 

    user_id = Column(
     Integer, 
     ForeignKey('user.id', ondelete='CASCADE'), 
     nullable=False, 
     index=True, 
    ) 



    orgname = Column(Unicode, nullable=False) 

    def __init__(self, **kwargs): 
     super(Client, self).__init__(**kwargs) 

Bu

u = User(user_name=u'dusual') 
session.add(u) 
c = Client(user=u, orgname="dummy_org") 
session.add(c) 

gibi bir şey yapmaya çalışıyorum Değil Ama sqlalchemy geri söyleyerek bağırır: Benim veritabanında yeni bir tablo müşteri oluşturduk.

(k, cls_ name)) TypeError: 'kullanıcı', İstemci

için bir geçersiz anahtar kelime argümanıdır.

Şimdi bu olmamalı Kullanıcının bir anahtar kelime argümanı olarak izin vermesi gerektiğine inanmakla, masamın kullanıcı anahtar kelime argümanını alabildiğinden nasıl emin olabilirim. - atayarak ya iki şekilde User örneklerini ve Client modellerini ilişkilendirebilirsiniz

class Client(DeclarativeBase): 

    __tablename__ = 'client' 

    id = Column(Integer, primary_key=True) 

    user_id = Column(
     Integer, 
     ForeignKey('user.id', ondelete='CASCADE'), 
     nullable=False, 
     # no need to add index=True, all FKs have indexes 
    ) 
    user = relationship('User', backref='clients') 

    orgname = Column(Unicode, nullable=False) 

    # no need to add a constructor 

Sonra sqlalchemy.orm ithalat ilişkisinden

:

cevap

15

Bir relationshipUser ila Client modellerini tanımlamak gerekir Bir tam sayı Client.user_id:

u = User(user_name=u'dusual') 
session.add(u) 
session.flush() # to make sure the id is fetched from the database 
c = Client(user_id=u.id, orgname="dummy_org") 
session.add(c) 

veya User örneğini Client.user adresine aktararak. Açıkça bir ilişki eserlerini ilan

u = User(user_name=u'dusual') 
u.clients.append(Client(orgname="dummy_org")) 
session.add(u) 
+1

Well: -

u = User(user_name=u'dusual') # no need to flush, no need to add 'u' to the session because sqlalchemy becomes aware of the object once we assign it to c.user c = Client(user=u, orgname="dummy_org") session.add(c) 

Aslında üçüncü bir yol var biz Client.user bir backref yapılandırılmış beri, SQLAlchemy bizim User modeline liste benzeri clients niteliğini eklendi . Ama bunun işe yaradığı gizli bir yol olup olmadığını merak ediyordum çünkü referans için baktığım kodun bir kısmı için çalışıyor gibi görünüyor. – dusual

+0

nicee :) iyi açıkladı – deeshank

İlgili konular