代码之家  ›  专栏  ›  技术社区  ›  Agos

Django不使用字段查找从查询集中排除特定实例

  •  30
  • Agos  · 技术社区  · 14 年前

    有时我需要确保从查询集中排除某些实例。
    我通常是这样做的:

    unwanted_instance = MyModel.objects.get(pk=bad_luck_number)
    uninteresting_stuff_happens()
    my_results = MyModel.objects.exclude(id=unwanted_instance.id)
    

    或者,如果我有更多:

    my_results = MyModel.objects.exclude(id_in=[uw_in1.id, uw_in2.id, uw_in3.id])
    

    这个“感觉”有点笨拙,所以我试着:

    my_ideally_obtained_results = MyModel.objects.exclude(unwanted_instance)
    

    这不管用。但我读 here on SO 子查询可以用作排除的参数。
    我运气不好吗?我是否缺少一些功能(检查了文档,但没有找到任何有用的指针)

    3 回复  |  直到 6 年前
        1
  •  68
  •   obeattie    14 年前

    你已经这样做了,这是最好的方法。

    如果这是一种模式不可知论的方式来做这件事你正在寻找,不要忘记你可以做。 query.exclude(pk=instance.pk) .

    作为旁白, 如果 Django的ORM有一个身份映射器(目前没有),那么你就可以做类似的事情 MyModel.objects.filter(<query>).all().remove(<instance>) 但你在这方面运气不好。你做这件事的方式(或上面的方式)是你最好的。

    哦,你也可以做得更好 in 列表理解查询: query.exclude(id__in=[o.id for o in <unwanted objects>])

        2
  •  5
  •   kartheek    12 年前

    给出的答案是完美的,试试这个对我来说很好。

    步骤1)

     from django.db.models import Q
    

    步骤2)

     MyModel.objects.filter(~Q(id__in=[o.id for o in <unwanted objects>]))
    
        3
  •  1
  •   Dmitriy rajalaxmi    6 年前

    您可以将不需要的项目放在列表中,然后提取除列表中的项目以外的所有项目,如下所示:

    MyModel.objects.exclude(id__in=[id1,id2,id3 ])