我的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()
答案 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