遍历查询集并将查找值注释为记录

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