我有一个这样的查询集:
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'
再次编辑
这个问题的唯一解决方法是使用枚举。
答案 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