2015-09-06 1 views
0

У меня есть следующие модели Django:Как описать отношения One To One от Django ORM в SqlAlchemy?

class News(models.Model): 
    title = models.CharField(max_length=1000) 
    # some fields 
    image = models.ForeignKey("media.Image",blank=True, null=True) 

# and in another django module 
class Image(models.Model): 
    url = models.URLField(max_length=1000) 

В Postgres это выглядит как:

=> \d newsfeed_news 

    Column |   Type   |       Modifiers       
-------------+--------------------------+------------------------------------------------------------ 
id   | integer     | not null default nextval('newsfeed_news_id_seq'::regclass) 

... 

image_id | integer     | 

Это означает, что поле «Image» в таблице - это просто целое поле, содержащий идентификатор образ.

Я пытался построить эти отношения в SQLAlchemy:

class Image(Base): 
    __tablename__ = 'media_image' 
    id = Column(Integer, primary_key=True) 
    url = Column('url',String) 

class newsTable(Base): 
    __tablename__ = 'media_news' 
    id = Column(Integer, primary_key=True) 
    # some fields 
    image_id = Column(Integer, ForeignKey('Image.id')) 
    image = relationship("Image", uselist=False) 

Но я получил следующее сообщение об ошибке:

Can't find any foreign key relationships between 'newsfeed_news' and 'media_image'. Could not determine join condition between parent/child tables on relationship newsTable.image - there are no foreign keys linking these tables.

Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.

Что я делаю не так?

ответ

0

Согласно документации ForeignKey принимает column параметр, который определяется как:

A single target column for the key relationship. A Column object or a column name as a string: tablename.columnkey or schema.tablename.columnkey .

Вы пытаетесь указать имя столбца в виде строки, но нет ни одной таблицы с именем Image. Вы можете ссылаться на Column объект непосредственно из Image модели:

image_id = Column(Integer, ForeignKey(Image.id)) 

Или обеспечить правильное имя таблицы:

image_id = Column(Integer, ForeignKey('media_image.id')) 
Смежные вопросы