我有一个模特:
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
答案 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
)