0
我遇到了這個問題:我有兩個表,一個叫Team,另一個叫Event。事情是,我想在這兩個表之間建立一對一的關係,但是在Event表中,我希望在兩個字段中有這樣的關係,一個叫home(主隊),另一個叫away(從客場)隊。sqlalchemy - 在同一張表的兩個不同字段中使用不同表的一對一關係
但是,sqlalchemy抱怨我做錯了什麼,我不知道它是什麼,錯誤是:«ArgumentError:創建關係'Event.away_team'的backref'Event'時出錯:屬性該名稱存在於映射器'Mapper | Team | bt_team'»上。我可能做錯了什麼?這裏是我的模型:
#!/usr/bin/env python2
# coding: utf-8
# VENI, SANCTE SPIRITUS
import sqlalchemy
import common_models
import datetime
class Team(common_models.Base):
""" Database table for soccer teams
"""
__tablename__ = "bt_team"
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
name = sqlalchemy.Column(sqlalchemy.String(30), unique=True)
monitored_since = sqlalchemy.Column(
sqlalchemy.DateTime, default=datetime.datetime.utcnow)
# Huh, another field is not required?
event_id = sqlalchemy.Column(
sqlalchemy.Integer, sqlalchemy.ForeignKey("bt_event.id"))
def __repr__(self):
return "<Team {}>".format(self.name)
class Event(common_models.Base):
""" Database table for the events
"""
__tablename__ = "bt_event"
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
home_team = sqlalchemy.orm.relationship(
"Team", uselist=False, backref="Event")
away_team = sqlalchemy.orm.relationship(
"Team", uselist=False, backref="Event")
# the "1" in the bet board
home_wins = sqlalchemy.Column(sqlalchemy.String(7), nullable=True)
# the "2" in the bet board
away_wins = sqlalchemy.Column(sqlalchemy.String(7), nullable=True)
# the "X" in the bet board
draw = sqlalchemy.Column(sqlalchemy.String(7), nullable=True)
# when will this event start? (and any bet can be made)
event_date = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True)
# when was the last time this event was scraped?
updated = sqlalchemy.Column(
sqlalchemy.DateTime, nullable=True)
def __repr__(self):
return "<Event {} v {} ({} UK): 1 {} - X {} - 2 {}>".format(
self.home_team.name, self.away_team.name,
self.event_date.strftime("%d %B %H:%M"),
self.home_wins, self.draw, self.away_wins)
def get_match_teams(self):
""" Return a string with the teams names which is the event name
"""
return "{} v {}".format(self.home_team.name,
self.away_team.name)
,這裏是完整的錯誤:
E
======================================================================
ERROR: Get the bets for the next two soccer plays
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/nose/case.py", line 267, in setUp
try_run(self.test, names)
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/nose/util.py", line 470, in try_run
return func()
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/tests/test_bets.py", line 46, in s
team1 = betevent_models.Team(name="FK Krasnodar")
File "<string>", line 2, in __init__
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/instrumentation.py", line 324, in _new_state_if_none
state = self._state_constructor(instance, self)
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 725, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/instrumentation.py", line 158, in _state_constructor
self.dispatch.first_init(self, self.class_)
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/event/attr.py", line 260, in __call__
fn(*args, **kw)
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2687, in _event_on_first_init
configure_mappers()
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 2583, in configure_mappers
mapper._post_configure_properties()
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 1688, in _post_configure_properties
prop.init()
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/interfaces.py", line 144, in
init
self.do_init()
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1553, in do_init
self._generate_backref()
File "/home/jorge/coders/PPH/clientes/anton_b/app1-539916/codigo/lib/python2.7/site-packages/sqlalchemy/orm/relationships.py", line 1743, in _generate_backref
(backref_key, self, m))
ArgumentError: Error creating backref 'Event' on relationship 'Event.away_team': property of that name exists on mapper 'Mapper|Team|bt_team'
我如何能實現我在尋找什麼呢?
編輯:好像更適合於有許多一對多關係,而不是因爲球隊能有ñ事件和事件可以有兩支球隊。