遍历查询集并将查找值注释为记录
Loop through queryset and annotate lookup value to records
我想为查询集中的每条记录查找一个值,并将该值添加到查询集中。
我的观点如下。
class InvoiceViewSet(ModelViewSet):
queryset = Invoice.objects.all()
serializer_class = InvoiceSerializer
def get_queryset(self):
user = self.request.user
customer_id = Customer.objects.only('ref').get(user_id=user.id)
queryset = Invoice.objects.filter(supplier_id=customer_id.ref)
for invoice in queryset:
program = FunderProgramMember.objects.get(supplier=invoice.supplier_id, buyer=invoice.buyer)
invoice.annotate(discount_rate=Value(program.discount_rate))
return queryset
由于查询集中的发票可能有不同的折扣,我遍历查询集并添加相关折扣。
我收到以下错误:'Invoice' 对象没有属性 'annotate'
我可以对查询集进行注释(这对我没有帮助,因为查询集中的记录不会都具有相同的折扣)但似乎我无法对查询集中的记录进行注释。
还有其他方法可以实现吗?
即使我可以对单个记录进行注释,我也不确定这些值是否会通过我的 return 查询集传递?
编辑:
不确定这是否是最好的方法..但它似乎有效:
class InvoiceViewSet(ModelViewSet):
queryset = Invoice.objects.all()
serializer_class = InvoiceSerializer
def get_queryset(self):
user = self.request.user
customer_id = Customer.objects.only('ref').get(user_id=user.id)
queryset = Invoice.objects.filter(supplier_id=customer_id.ref)
for invoice in queryset:
program = FunderProgramMember.objects.get(supplier=invoice.supplier_id, buyer=invoice.buyer)
invoice.discount_rate = program.discount_rate
return queryset
您可以使用 Subquery expressions
来支持这样的注解:
program_discount_subquery = FunderProgramMember.objects.filter(
supplier=OuterRef('supplier'), buyer=OuterRef('buyer')
).values('discount_rate')[:1]
queryset = Invoice.objects.filter(
supplier_id=customer_id.ref
).annotate(discount_rate=Subquery(program_discount_subquery))
查询集中的每张发票都会有一个属性 discount_rate
。
我想为查询集中的每条记录查找一个值,并将该值添加到查询集中。 我的观点如下。
class InvoiceViewSet(ModelViewSet):
queryset = Invoice.objects.all()
serializer_class = InvoiceSerializer
def get_queryset(self):
user = self.request.user
customer_id = Customer.objects.only('ref').get(user_id=user.id)
queryset = Invoice.objects.filter(supplier_id=customer_id.ref)
for invoice in queryset:
program = FunderProgramMember.objects.get(supplier=invoice.supplier_id, buyer=invoice.buyer)
invoice.annotate(discount_rate=Value(program.discount_rate))
return queryset
由于查询集中的发票可能有不同的折扣,我遍历查询集并添加相关折扣。
我收到以下错误:'Invoice' 对象没有属性 'annotate' 我可以对查询集进行注释(这对我没有帮助,因为查询集中的记录不会都具有相同的折扣)但似乎我无法对查询集中的记录进行注释。
还有其他方法可以实现吗? 即使我可以对单个记录进行注释,我也不确定这些值是否会通过我的 return 查询集传递?
编辑: 不确定这是否是最好的方法..但它似乎有效:
class InvoiceViewSet(ModelViewSet):
queryset = Invoice.objects.all()
serializer_class = InvoiceSerializer
def get_queryset(self):
user = self.request.user
customer_id = Customer.objects.only('ref').get(user_id=user.id)
queryset = Invoice.objects.filter(supplier_id=customer_id.ref)
for invoice in queryset:
program = FunderProgramMember.objects.get(supplier=invoice.supplier_id, buyer=invoice.buyer)
invoice.discount_rate = program.discount_rate
return queryset
您可以使用 Subquery expressions
来支持这样的注解:
program_discount_subquery = FunderProgramMember.objects.filter(
supplier=OuterRef('supplier'), buyer=OuterRef('buyer')
).values('discount_rate')[:1]
queryset = Invoice.objects.filter(
supplier_id=customer_id.ref
).annotate(discount_rate=Subquery(program_discount_subquery))
查询集中的每张发票都会有一个属性 discount_rate
。