Sqlalchemy关系字段返回Non

2024-09-30 20:32:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

class DictionaryItem(Base):
    __tablename__ = 'dictionary_items'

    id = Column(Integer, primary_key=True)
    text = Column(String, nullable=True)
    phonetic_symbols = Column(String, nullable=True)
    fgner_entity = Column(String, nullable=True)
    status  = Column(String, default="waiting")

    user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
    user = relationship("User", back_populates="dictionary_items")

    data_type_id = Column(Integer, ForeignKey('data_types.id'), nullable=False)
    data_type = relationship("DataType", back_populates="dictionary_items", lazy="joined")

    # can null if manually add
    sns_raw_data_id = Column(Integer, ForeignKey('sns_raw_data.id'), nullable=True)
    sns_raw_data = relationship("SnsRawData", back_populates="dictionary_items")

    language_id = Column(Integer, ForeignKey('languages.id'), nullable=False, default=1)
    language = relationship("Language", back_populates="dictionary_items")

    created_at = Column(DateTime, nullable=False, default=func.now())
    updated_at = Column(DateTime, nullable=False,
                        default=func.now(), onupdate=func.now())
    deleted_at = Column(DateTime, nullable=True)

    def __repr__(self):
        return 'id: {}'.format(self.id)

    @classmethod
    def check_is_exists(cls, user_id, text, dictionary_id=None):
        if dictionary_id is not None:
            count = session.query(DictionaryItem).filter(DictionaryItem.user_id==user_id, DictionaryItem.text==text, DictionaryItem.deleted_at == None, DictionaryItem.id != dictionary_id).count()
        else:
            count = session.query(DictionaryItem).filter(DictionaryItem.user_id==user_id, DictionaryItem.text==text, DictionaryItem.deleted_at == None).count()
        return count > 0
    @classmethod
    def add_dictionary_item(cls, text=None, phonetic_symbols=None, fgner_entity=None, user_id=None, data_type_id=None, language_id=None, sns_raw_data_id=None):
        if not DictionaryItem.check_is_exists(user_id, text):
            new_dictionary_item = DictionaryItem(
                text=text, 
                phonetic_symbols=phonetic_symbols, 
                fgner_entity=fgner_entity, 
                user_id=user_id, 
                data_type_id=data_type_id, 
                language_id=language_id,
                sns_raw_data_id=sns_raw_data_id
            )
            try:
                session.add(new_dictionary_item)
                session.commit()
                session.refresh(new_dictionary_item)
            except:
                session.rollback()
                raise
            return new_dictionary_item
        else:
            return None


Language.dictionary_items = relationship("DictionaryItem", order_by=DictionaryItem.id, back_populates="language")

@event.listens_for(DictionaryItem, 'before_update')
def dictionary_item_before_update(mapper, connection, target):
    print("before_update: %d" % target.id)
    if target.sns_raw_data_id is not None:
        if "language" in target.sns_raw_data.data:
            target.language_id = get_language_id_by_language(target.sns_raw_data.data["language"])

    if target.language_id is None:
        target.language_id = detect_language_id(target.text)


@event.listens_for(DictionaryItem, 'before_insert')
def dictionary_item_before_insert(mapper, connection, target):
    print("before_insert: %s" % target.text)
    print(target.sns_raw_data, file=sys.stderr)
    if target.sns_raw_data_id is not None:
        if "language" in target.sns_raw_data.data:
            target.language_id = get_language_id_by_language(target.sns_raw_data.data["language"])

    if target.language_id is None:
        target.language_id = detect_language_id(target.text)

SnsRawData.dictionary_items = relationship("DictionaryItem", order_by=DictionaryItem.id, back_populates="sns_raw_data")
User.dictionary_items = relationship("DictionaryItem", order_by=DictionaryItem.id, back_populates="user")
DataType.dictionary_items = relationship("DictionaryItem", order_by=DictionaryItem.id, back_populates="data_type")

class SnsRawData(Base):
    __tablename__ = 'sns_raw_data'

    id = Column(Integer, primary_key=True)
    data = Column(postgresql.JSON)

    status  = Column(String, default="waiting")

    sns_account_id = Column(Integer, ForeignKey('sns_accounts.id'), nullable=False)
    sns_account = relationship("SnsAccount", back_populates="sns_raw_data", lazy="joined")

    created_at = Column(DateTime, nullable=False, default=func.now())
    updated_at = Column(DateTime, nullable=False,
                        default=func.now(), onupdate=func.now())
    deleted_at = Column(DateTime, nullable=True)

    def __repr__(self):
        return 'id: {}'.format(self.id)

SnsAccount.sns_raw_data = relationship("SnsRawData", order_by=SnsRawData.id, back_populates="sns_account")

字典项通过sns\u raw\u data\u id与SnsRawData建立关系

在DictionaryItem lister\u中,我当前获取的事件('before\u insert') target.sns\u原始数据.数据返回None buttarget.sns\u原始数据\u id插入时返回一个值。你知道吗

File "/app/models.py", line 230, in dictionary_item_before_insert
    if "language" in target.sns_raw_data.data:
AttributeError: 'NoneType' object has no attribute 'data'

当我有SnsRawData模型的Id时,如何访问它的数据字段?你知道吗


Tags: textnoneidtargetdatarawdictionaryback
1条回答
网友
1楼 · 发布于 2024-09-30 20:32:01

我想出来了,它返回None,因为它是在insert之前运行的,所以没有任何关系可以开始,我只需要从DictionaryItem用sns\u raw\u data\u id查询SnsRawData

@event.listens_for(DictionaryItem, 'before_insert')
def dictionary_item_before_insert(mapper, connection, target):
    print("before_insert: %s" % target.text)

    if target.sns_raw_data_id is not None:
        sns_raw_data = session.query(SnsRawData).filter(SnsRawData.id==target.sns_raw_data_id).first()

        if "language" in sns_raw_data.data:
            target.language_id = get_language_id_by_language(sns_raw_data.data["language"])

    if target.language_id is None:
        target.language_id = detect_language_id(target.text)

相关问题 更多 >