关于python:列表中的项目,但索引始终为0

Item in list but index is always 0

我有一个这样的查询集:

1
asignaturas_equivalencia_alumno = list(Asignaturas_Equivalencia.objects.filter(matricula=inscripcion.usuario.adicional.matricula, origen_de_equivalencia ="SEP").distinct())

然后我循环它们并打印索引,如果它在列表中并且是模型的属性:

1
2
for _as in asignaturas_equivalencia_alumno:
    print _as in asignaturas_equivalencia_alumno, asignaturas_equivalencia_alumno.index(_as), _as.clave_materia

结果是不同的,但是索引,索引总是返回0,输出:

1
2
3
4
5
6
7
8
9
10
11
12
True 0 L1C115
True 0 L1PS101
True 0 L1C116
True 0 L1C118
True 0 L1PS105
True 0 L1PS107
True 0 L1PS109
True 0 L1PS111
True 0 L1C113
True 0 L1C114
True 0 L1C117
True 0 L1PS102

谢谢:

编辑

模型:

1
2
3
4
5
6
7
8
9
class Asignaturas_Equivalencia(models.Model):
    matricula = models.CharField(max_length=10, primary_key=True)
    clave_materia = models.CharField(max_length=9)
    calificacion = models.CharField(max_length=2)
    origen_de_equivalencia = models.CharField(max_length=4)
    fecha_registro = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'diccionario_equivalencias_materias'

再次编辑

这个问题唯一的解决办法是使用枚举。


正如其他人正确地提到的,对于有序的不可抗力成员来说,平等测试可能是脆弱的。但是,如果您想循环遍历内容并拥有索引,那么简单地使用枚举就更容易、更高效了。

1
2
for index,_as in enumerate(asignaturas_equivalencia_alumno):
     print _as in asignaturas_equivalencia_alumno, index, _as.clave_materia

检查并再次检查您的主键。在我看来,他们是唯一能把你的平等检查搞砸的东西。

当两个对象属于同一类且具有相同的pk时,Django的ORM的__eq__方法返回True。我猜,当你有两个字段和primary_key = True时,它会变得混乱。它应该在faik中抛出一些错误,但可能只会导致未定义的行为。

从Django模型文档中:

"Each model requires exactly one field to have primary_key=True
(either explicitly declared or automatically added)."

(强调矿山)


您有不同的项目,如_as.clave_materia所示。我想知道这个类定义是什么样子的。

也许你写了自己的__eq__方法,或者类似的方法。如果您这样做了,它可能有问题,并且总是为对象列表的第一个元素返回True。听起来像是解释吗?

类似这样的事情(IPython会话):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
In [44]: class Foo:  
    def __eq__(self, s): return True
   ....:    

In [45]: a = Foo()

In [46]: b = Foo()

In [47]: a == b
Out[47]: True

In [48]: l = [a,b, Foo()]

In [49]: l
Out[49]:
[<__main__.Foo at 0xb5c68b2c>,
 <__main__.Foo at 0xb670ad0c>,
 <__main__.Foo at 0xb5e0352c>]

In [50]: for item in l:
    print(l.index(item))
   ....:    
0
0
0