2012-12-23 13 views
14

Używam sqlalchemy do zaprojektowania witryny w stylu forum. Zacząłem wybijać projekt, ale za każdym razem, gdy próbuję go przetestować za pomocą kilku wkładek, zrzuca cegłę;Czy ktoś może powiedzieć, co jest złego w moich związkach?

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. 

Oto moje „modele”

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 za zabawny tytuł – Adam

Odpowiedz

5

Twój model Post nie ma odwołania do . Dodaj kolumnę Post odwołującego się Thread post należy do:

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')) 

Nie możemy używać nazwy thread bo to właśnie relacje Post.replies doda do wyszukanych Thread przypadkach.

Jest to relacja One to Many udokumentowana w dokumentacji konfiguracji powiązań SQLAlchemy.

5

Należy dodać pole w modelu post, który brzmi:

thread_id = Column(Integer, ForeignKey("thread.id"), nullable=True, default=None) 

Jak SQLAlchemy wiedzieć, jak ta relacja zdefiniowano ma powiązać thhread z postem? Dlatego powinieneś mieć klucz obcy z postu do wątku. Możesz pozwolić na to, by było puste, jeśli nie należy do wątku, to zależy od twojego przypadku użycia.

+0

Świetna odpowiedź, ale dam ją martijn <3 –

+0

@JakobBowyer Bez obaw! <3 :) – jadkik94

Powiązane problemy