Python Django-如何组合2个queryset和filter以在两个queryset中获得相同的元素?

Python Django-如何组合2个queryset和filter以在两个queryset中获得相同的元素?,python,django,python-3.x,Python,Django,Python 3.x,我有一个模型: class LocationItem(models.Model): location = models.ForeignKey(Location, on_delete=models.CASCADE) item = models.ForeignKey(Item, on_delete=models.CASCADE) stock_qty = models.IntegerField(null=True) 示例:我有如下数据: -------------------

我有一个模型:

class LocationItem(models.Model):
    location = models.ForeignKey(Location, on_delete=models.CASCADE)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    stock_qty = models.IntegerField(null=True)
示例:我有如下数据:

------------------------------
| ID | Item | Location | Qty |
------------------------------
| 1  |  1   |    1     |  10 |
------------------------------
| 2  |  2   |    1     |  5  |
------------------------------
| 3  |  1   |    2     |  2  |
------------------------------
| 4  |  3   |    1     |  4  |
------------------------------
| 5  |  3   |    2     |  20 |
------------------------------
我有2个查询集来获取每个位置的项目:

location_1 = LocationItem.objects.filter(location_id=1)
location_2 = LocationItem.objects.filter(location_id=2)

现在我想将上面的2个查询集合并为1,并只过滤2个位置中的相同项,例如上面这个示例的结果是
[Item 1,Item 3]
,因为Item 1和3同时属于位置1和2

您可以使用以下表达式组合django查询集

location_1 = LocationItem.objects.filter(location_id=1)
location_2 = LocationItem.objects.filter(location_id=2)

location = location_1 | location_2
上述组合表达式适用于同一模型过滤器查询集

试试这个

from django.db.models import Count
dupes = LocationItem.objects.values('item__id').annotate(Count('id')).order_by().filter(id__count__gt=1)
LocationItem.objects.filter(item__=[i['item__id'] for i in dupes]).distinct('item__id')

可能高于解决方案帮助。

您可以使用以下表达式组合django查询集

location_1 = LocationItem.objects.filter(location_id=1)
location_2 = LocationItem.objects.filter(location_id=2)

location = location_1 | location_2
上述组合表达式适用于同一模型过滤器查询集

试试这个

from django.db.models import Count
dupes = LocationItem.objects.values('item__id').annotate(Count('id')).order_by().filter(id__count__gt=1)
LocationItem.objects.filter(item__=[i['item__id'] for i in dupes]).distinct('item__id')

可能高于解决方案帮助。

如果希望两个条件都为真,则需要
运算符(
&


如果希望这两个条件都为真,则需要
运算符(
&


可以通过管道连接过滤器来实现这一点。过滤器的结果是查询集。因此,在第一次筛选之后,结果将是
[Item1,Item2,Item3]
,然后第二次筛选将应用于结果查询集,该查询集将导致
[Item1,Item3]
。例如

Item.objects.filter(locationitem_set__location = 1).filter(locationitem_set__location = 2)

p.S.未经测试。希望这能起作用。

您可以通过管道连接过滤器来实现这一点。过滤器的结果是查询集。因此,在第一次筛选之后,结果将是
[Item1,Item2,Item3]
,然后第二次筛选将应用于结果查询集,该查询集将导致
[Item1,Item3]
。例如

Item.objects.filter(locationitem_set__location = 1).filter(locationitem_set__location = 2)
p.S.未经测试。希望这能奏效。

试试这个:

location1_items_pk = LocationItem.objects.filter(
    location_id=1
).values_list("item_pk", flat=true)

Result = Location.objects.filter(
    item_pk__in=location1_items_pk, location_id=2
)
试试这个:

location1_items_pk = LocationItem.objects.filter(
    location_id=1
).values_list("item_pk", flat=true)

Result = Location.objects.filter(
    item_pk__in=location1_items_pk, location_id=2
)


那么,在本例中,您认为结果查询或列表应该是什么样的呢?上面这个示例的结果是[1,3],因为项目1和3同时属于位置1和2,如果还有另一行| 5 | 2 | 2 | 30 |?结果是什么?如果有第5行、第2行、第2行、第30行,结果是[第1项、第3项、第2项],那么您需要唯一的项目和唯一的位置:)那么,在本例中,您认为结果查询或列表应该是什么样的呢?上面这个示例的结果是[1,3],因为项目1和3同时属于位置1和2,如果还有另一行| 5 | 2 | 2 | 30 |?结果是什么?如果有第5行、第2行、第2行、第30行,结果是[第1项、第3项、第2项],那么您需要唯一的项目和唯一的位置:)我只想获得位置_1和位置_2的相同项的queryset存储。在这种情况下是[1,3],因为项目1和3同时属于位置1和2。我很抱歉,您的代码的结果是错误的,因为它将获取2 queryset的所有元素,而我只想获取位置1中的项目,它们也出现在位置2。我很抱歉,但是结果返回为空queryset,带有
Q(位置1)&Q(位置2)
我只想获得一个queryset存储位置1和位置2的相同项目。在这种情况下是[1,3],因为项目1和3同时属于位置1和2。我很抱歉,您的代码的结果是错误的,因为它将获取2 queryset的所有元素,而我只想获取位置1中的项目,它们也出现在位置2。我很抱歉,但是结果返回为空queryset,带有
Q(位置1)&Q(位置2)
@trent fernandez查看更新的答案可能是有帮助的。@trent fernandez查看更新的答案可能是有帮助的。很抱歉,我在model
LocationItem
中进行筛选,而不是model
Item
中。我怎样才能像你一样过滤?对不起,我在型号
LocationItem
中过滤,而不是在型号
Item
中过滤。我怎么能像你一样过滤呢?很有效。非常感谢你^_^不客气。如果它是您想要的答案,请随意选择它作为正确答案:)当然可以,但它会导致子查询,在许多情况下,子查询的性能会较低。此外,这实际上是两个独立的查询。非常感谢你^_^不客气。如果它是您想要的答案,请随意选择它作为正确答案:)当然可以,但它会导致子查询,在许多情况下,子查询的性能会较低。此外,这实际上作为两个独立的查询工作