Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加到列表中的项目未按预期顺序排列_Python_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 添加到列表中的项目未按预期顺序排列

Python 添加到列表中的项目未按预期顺序排列,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,联系人按1,2,3的顺序添加到列表中,但查询返回显示列表的顺序为奇怪的2,1,3。只有follow测试通过,请注意提交前后的最后3行 class Staff(mydb.Model): __tablename__ = 'STAFF' staff_id = mydb.Column(mydb.String(20), primary_key = True) first_name = mydb.Column(mydb.String(64)) last_name = mydb

联系人按1,2,3的顺序添加到列表中,但查询返回显示列表的顺序为奇怪的2,1,3。只有follow测试通过,请注意提交前后的最后3行

class Staff(mydb.Model):
    __tablename__ = 'STAFF'
    staff_id = mydb.Column(mydb.String(20), primary_key = True)
    first_name = mydb.Column(mydb.String(64))
    last_name = mydb.Column(mydb.String(64))
    email = mydb.Column(mydb.String(62), unique=True, nullable = False)
    password = mydb.Column(mydb.String(), nullable = False)

class StaffContact(mydb.Model):
    __tablename__ = 'STAFF_CONTACT'
    staff_id = mydb.Column(mydb.String(20), mydb.ForeignKey('STAFF.staff_id'), primary_key = True)
    department = mydb.Column(mydb.String(50), primary_key = True)
    office = mydb.Column(mydb.String(50))
    phone = mydb.Column(mydb.String(15))
    staff_obj = mydb.relationship('Staff', backref='contact_list')

def test_add_contact_to_new_staff(self):
    staff = Staff(
        staff_id='QWE',
        first_name='QWE',
        last_name='QWE',
        email='QWE',
        password='QWE')
    mydb.session.add(staff)
    mydb.session.commit()
    staff_rst1 = mydb.session.query(Staff).filter_by(staff_id='QWE').first()
    self.assertEquals(staff_rst1, staff)
    self.assertIs(staff_rst1, staff)    
    contact_1 = StaffContact(
        staff_id = 'XYZ',
        department='XYZ',
        office='XYZ',
        phone='XYZ'
        )
    contact_2 = StaffContact(
        staff_id = 'ABC',
        department='ABC',
        office='ABC',
        phone='ABC'
        )   
    contact_3 = StaffContact(
        staff_id = 'EFG',
        department='EFG',
        office='EFG',
        phone='EFG'
        )                       
    staff_rst1.contact_list=[contact_1, contact_2, contact_3]
    mydb.session.add(staff_rst1)
    self.assertIs(staff_rst1.contact_list[0], contact_1)
    self.assertIs(staff_rst1.contact_list[1], contact_2)
    self.assertIs(staff_rst1.contact_list[2], contact_3)
    mydb.session.commit()
    staff_rst2 = mydb.session.query(Staff).filter_by(staff_id='QWE').first()
    self.assertIs(staff_rst2.contact_list[0], contact_2)
    self.assertIs(staff_rst2.contact_list[1], contact_1)
    self.assertIs(staff_rst2.contact_list[2], contact_3)    

数据库按照最适合内部实现的顺序返回staff实例的联系人,而不是按照您将联系人插入关系的顺序

然后,您必须使用以下命令指定数据库应如何为您的联系人排序:

如果
contact_list
是反向引用,您可以通过以下方式指定
order_:


这将根据Concat的主id对其进行排序。如果需要维护无法从数据库中已包含的信息派生的特定顺序,您必须在联系人中添加一个
位置
列,并使用来帮助维持该顺序。

仅出于调试目的,您是否可以尝试删除行
mydb.session.add(staff_rst1)
,并检查您是否仍然面临该问题?
contact_list = relationship('StaffContact', order_by='StaffContact.id')
from sqlalchemy.orm import backref

staff_obj = mydb.relationship(
    'Staff', backref=backref('contact_list', order_by='StaffContact.id'))