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查看更新的答案可能是有帮助的。很抱歉,我在modelLocationItem
中进行筛选,而不是modelItem
中。我怎样才能像你一样过滤?对不起,我在型号LocationItem
中过滤,而不是在型号Item
中过滤。我怎么能像你一样过滤呢?很有效。非常感谢你^_^不客气。如果它是您想要的答案,请随意选择它作为正确答案:)当然可以,但它会导致子查询,在许多情况下,子查询的性能会较低。此外,这实际上是两个独立的查询。非常感谢你^_^不客气。如果它是您想要的答案,请随意选择它作为正确答案:)当然可以,但它会导致子查询,在许多情况下,子查询的性能会较低。此外,这实际上作为两个独立的查询工作