列表中的项目,但索引始终为0

时间:2014-01-10 19:00:38

标签: python django

我有一个这样的查询集:

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

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

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

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

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

谢谢:)

修改

模特:

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'

再次编辑

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

3 个答案:

答案 0 :(得分:1)

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

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

像这样(IPython会话):

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

答案 1 :(得分:1)

检查并仔细检查您的主键。在我看来,他们是唯一可能会破坏你的平等检查的东西。

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

来自the Django Models documentation

  

“每个模型需要完全一个字段才能使primary_key = True   (明确声明或自动添加)。“

(强调我的)

答案 2 :(得分:1)

正如其他人正确提到的那样,对于有序的可迭代成员来说,相等性测试可能是脆弱的。但是如果你想循环内容并拥有索引,那么简单地使用枚举就更容易,更有效。

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