Django - 如何组合2个查询集和过滤器以在两个查询集中获取相同的元素?

时间:2016-11-03 14:18:53

标签: 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)

示例:我有一些这样的数据:

------------------------------
| 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],因为项目1和3属于位置1和2

4 个答案:

答案 0 :(得分: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')

可能在解决方案帮助之上。

答案 1 :(得分:0)

如果您希望两个条件都为真,那么您需要AND运算符(&

from django.db.models import Q

Q(location_1) & Q(location_2)

答案 2 :(得分:0)

您可以通过管道过滤器来完成此操作。过滤器的结果是查询集。因此,在第一次过滤后,结果将为[Item1, Item2 , Item3],然后第二个过滤器将应用于生成[Item1, Item3]的结果查询集。例如。

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

P.S。没有测试过。希望这有效。

答案 3 :(得分:0)

试试这个:

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
)