2012-12-23 35 views
14

Bir forum stili web sitesi tasarlamak için sqlalchemy kullanıyorum. Tasarımı devirmeye başladım ama her seferinde birkaç kesici uçla test etmeye çalışıyorum; bu ilişki tanımladığınız nasılİlişkilerimde neyin yanlış olduğunu bilen var mı?

SQLAlchemy gerekiyordu nasıl
thread_id = Column(Integer, ForeignKey("thread.id"), nullable=True, default=None) 

bilmek: Burada

NoForeignKeysError: Could not determine join condition between parent/child 
tables on relationship Thread.replies - there are no foreign keys linking 
these tables. Ensure that referencing columns are associated with a 
ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression. 

Sen okur Mesaj modelinde bir alan eklemek gerekir

from sqlalchemy import Integer, Column, String, create_engine, ForeignKey 
from sqlalchemy.orm import relationship, sessionmaker, backref 
from .database import Base # declarative base instance 

class User(Base): 
    __tablename__ = "user" 
    id = Column(Integer, primary_key=True) 
    username = Column(String, unique=True) 
    email = Column(String, unique=True) 
    threads = relationship("Thread", backref="user") 
    posts = relationship("Post", backref="user") 

class Post(Base): 
    __tablename__ = "post" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    body = Column(String) 
    author = Column(Integer, ForeignKey("user.id")) 


class Thread(Base): 
    __tablename__ = "thread" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    desc = Column(String) 
    replies = relationship("Post", backref="thread") 
    author_id = Column(Integer, ForeignKey("user.id")) 
    board_id = Column(Integer, ForeignKey("board.id")) 

class Board(Base): 
    __tablename__ = "board" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    desc = Column(String) 
    threads = relationship("Thread", backref="board") 
    category_id = Column(Integer, ForeignKey("category.id")) 

class Category(Base): 
    __tablename__ = "category" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    desc = Column(String) 
    threads = relationship("Board", backref="category") 


engine = create_engine('sqlite:///:memory:', echo=True) 
Base.metadata.create_all(engine) 
session_factory = sessionmaker(bind=engine) 
session = session_factory() 
+44

+1 başlık için bu başlığı – Adam

cevap

5

Post modeliniz için thread referans numarası yok. O Post.replies ilişki alınan Thread örneklerine katacak budur çünkü

class Post(Base): 
    __tablename__ = "post" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    body = Column(String) 
    author = Column(Integer, ForeignKey("user.id")) 
    thread_id = Column(Integer, ForeignKey('thread.id')) 

Adını thread kullanamazsınız: Thread bir yazı başvuran Post bir sütun ekleyin aittir.

Bu, SQLAlchemy İlişki Yapılandırması belgelerinde belgelendiği gibi One to Many ilişkisidir.

5

benim "modelleri" dir bir yazıya bir thhread bağlamak gerekiyordu? Bu yüzden bir gönderiden iş parçacığına yabancı bir anahtarınız olmalı. Bir iş parçacığına ait değilse, boş olması için izin verebilirsiniz, kullanım durumunuza bağlıdır.

+0

Harika bir şekilde yanıtlayın, ama bunu şehre vereceğim <3 –

+0

@JakobBowyer Hayır, endişelenmeyin! <3 :) – jadkik94

İlgili konular