如何比较两个Django QuerySets并返回QuerySet,并从第二个中替换相同的值?

时间:2018-03-04 16:18:44

标签: python django django-queryset

我的env是Django 2.0.2和Python 3.6.1

如何比较两个Django QuerySets并返回QuerySet,并从第二个中替换相同的值?

例如,我有QuerySets:

>>> qs_local = PriceLocal.objects.filter(user_id=request.user.id)
>>> print(qs_local)
[{ 'user_id': 1, 'product_id': 1, 'price': 100 }] # one record

>>> qs_world = PriceWorld.objects.all()
>>> print(qs_world)
[{ 'product_id': 1, 'price': 300 }, { 'product_id': 2, 'price': 500 }, ... ] # many records

我想比较这个Django QuerySets并返回QuerySet,如下所示:

[{ 'product_id': 1, 'price': 100 }, { 'product_id': 2, 'price': 500 }, ...]

此时,我们正在从第二个到第一个QuerySet替换相同的记录(使用'product_id': 1)。

修改

我的模特:

class PriceWorld(models.Model):

    product_id = models.PositiveSmallIntegerField()
    price = models.PositiveSmallIntegerField()

class PriceLocal(models.Model):

    user_id = models.ForeignKey(User, on_delete=models.CASCADE)
    product_id = models.ForeignKey(PriceWorld, on_delete=models.CASCADE)
    price = models.PositiveSmallIntegerField()

2 个答案:

答案 0 :(得分:0)

您的要求并不完全清楚,但您似乎希望PriceWorld中的元素与PriceLocal中与特定用户ID相关的元素的product_ids匹配。所以:

PriceWorld.objects.filter(product_id__in=PriceLocal.objects.filter(user_id=request.user.id))

将作为子查询执行。

请注意,您的原始查询可以只写为request.user.pricelocal_set.all(),假设您没有更改related_name,那么您可以这样做:

PriceWorld.objects.filter(product_id__in=request.user.pricelocal_set.all())

这是完全相同的查询/子查询,但更具可读性。

答案 1 :(得分:0)

不了解queryset:

但是所需的输出可以通过使用:

来实现
for qs in qs_world:
    if qs['product_id']==qs_local[0]['product_id']:
        qs['price']=qs_local[0]['price']
    else:
        print "hii" 
print qs_world