SQLAlchemy самореферентная дилетна parent_id - PullRequest
1 голос
/ 31 июля 2011

У меня есть объект Category, подобный этому:

def parent_default(context):
    ''' default parent id if the name is not root '''
    id_ = None
    if context.current_parameters['name'] != u'root' :
        id_ = 1
    return id_


class Category(Base):
    ''' Class representing a product category. '''
    __tablename__ = "CATEGORY"
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(50), nullable=False)
    #self-referential mapper
    parent_id = Column(Integer, ForeignKey('CATEGORY.id'), default=parent_default)
    products = relationship("Product", backref="products")
    parent = relationship('Category', remote_side=[id], backref='sub_categories')

    __table_args__ = (
            UniqueConstraint('parent_id', 'name'),
        )

Проблема, с которой я сталкиваюсь, заключается в том, что я могу создать два «корневых» объекта с None «parent_id», кажется, что UniqueConstraint не делает «t применить к None 'parent_id' ?.В идеале должен быть только один объект с None parent_id.Должно быть, я что-то здесь упускаю.

1 Ответ

3 голосов
/ 31 июля 2011

Является ли кортеж NULL, 'root' уникальным, немного отличается от СУБД к СУБД;это было добавлено в стандарт SQL несколько недавно.В большинстве случаев это не уникально , в конце концов, NULL = NULL не соответствует действительности.

Вы уже требуете, чтобы корневой кортеж имел id, равный 1, чтобы вы могли безопасно удалить nullable = True из родительского идентификатора;а затем просто установите корневой объект в качестве собственного родителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...