【问题标题】:Item in list but index is always 0列表中的项目,但索引始终为 0
【发布时间】:2014-01-29 21:30:46
【问题描述】:

我有一个这样的查询集:

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...如果您尝试打印整个列表会发生什么?
  • 您需要将“as”更改为其他内容,这样您的代码就不会在较新版本的 Python 上崩溃。
  • 对不起,我的代码中没有 as 仅用于演示,我会更改它
  • 显示 AE 模型的代码。
  • 看到这个答案:stackoverflow.com/a/2513473/98057

标签: python django


【解决方案1】:

检查并仔细检查您的主键。在我看来,它们是唯一能像这样搞乱你的平等检查的东西。

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

来自the Django Models documentation

"每个模型都需要恰好一个字段具有 primary_key=True (显式声明或自动添加)。”

(强调我的)

【讨论】:

  • 我已经删除了一个primari_key并且索引总是0:C
  • 好吧,那我猜不透了。除非以某种方式,所有_as.matricula(无论它是什么)都是平等的。你能把它也添加到你的打印输出中,因为它是 pk 吗?
  • 嗯,我认为是我的问题,因为该模型中的任何字段都重复,所以没有人不能成为 primari_key,并且由于表格已经完成,我没有我只做了模型来使用它使用 django 我必须至少放一个 primari_key
  • 如果你没有明确设置主键(使用primary_key = True),Django 会为你创建一个(并且它是唯一的)。干杯。
  • Rail 的 Active Records 很好地处理了模式迁移。 Django 似乎正朝着同一个方向发展。也许您对Simple MigrationsMigratory 感兴趣。如果您已经在运行 >=1.7,您绝对应该查看Django's schema migration commands migrate and makemigrations
【解决方案2】:

您有不同的项目,如_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

【讨论】:

  • afaik 它是一个 django 模型类
  • 我自己的_eq_方法还没写,这是一个django模型
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多