【问题标题】:How to filter for ManyToManyField within a list?如何过滤列表中的 ManyToManyField?
【发布时间】:2014-10-29 10:35:14
【问题描述】:

我想改变这个:

cpses = CanonPerson.objects.filter(persons__vpd = 1)

到这里:

cpses = CanonPerson.objects.filter(persons__vpd in [1, 2, 3, 4, 5])

但这会引发异常:

NameError: global name 'persons__vpd' is not defined

型号:

class CanonPerson(models.Model):
    p_id                = models.PositiveIntegerField(primary_key=True)
    persons             = models.ManyToManyField(Person, related_name='persons')

class Person(models.Model):
    vp_id               = models.AutoField(primary_key=True)
    p_id                = models.PositiveIntegerField(db_index=True)
    vpd                 = models.ForeignKey(VPD, db_column='vpd')

class VPD(models.Model):
    id          = models.SmallIntegerField(primary_key=True)
    name        = models.CharField(max_length=100)

【问题讨论】:

  • 应该是 CanonPerson.objects.filter(persons__vpd__in = [1, 2, 3, 4, 5])
  • 不,它说:TypeError: int() argument must be a string or a number, not 'list'
  • 你的 CanonPerson 模型怎么样?
  • 使用 docs.djangoproject.com/en/dev/topics/db/queries/…CanonPerson.objects.filter(persons__vpd__in=[1,2,3,4,5]) 应该可以工作...
  • 差不多。 CanonPerson.objects.filter(persons__vpd__id__in=[1,2,3,4,5])

标签: django many-to-many django-1.5


【解决方案1】:

使用 https://docs.djangoproject.com/en/dev/topics/db/queries/#the-pk-lookup-shortcutCanonPerson.objects.filter(persons__vpd__in=[1,2,3,4,5]) 应该可以工作。

【讨论】:

  • 是的。我在第一条评论中提出了完全相同的建议,但他回答说它会产生错误。因为 person.vpd 是一个对象而不是数字。我是列表中的 person.vpd.id,所以 person__vpd__id__in 应该可以工作。
  • @OdifYltsaeb 我很抱歉,我相信我忽略了您评论中的__in。您最初的评论是正确的。
猜你喜欢
  • 2021-11-20
  • 2013-03-14
  • 1970-01-01
  • 2012-04-29
  • 2021-02-17
  • 2020-08-09
  • 1970-01-01
  • 2018-07-25
  • 2020-02-01
相关资源
最近更新 更多