Django:如何过滤查询集中的子集?

Django: How to filter a subset in a querset?

如何过滤子集中的元素?

class Order(models.Model):
    user                = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
    ...

class Bill(models.Model):
    order           = models.ForeignKey(Order, blank=True, null=True, on_delete=models.SET_NULL))
    billdate        = models.DateTimeField(default=timezone.now)
    payed           = models.BooleanField(default=False)
    ...

例如:

    order = Orders.objects.all()
    order[0].bill_set # Should return only 3 bills
    order[1].bill_set # Should return only 3 bills
    order[2].bill_set # Should return only 3 bills
    order[3].bill_set # Should return only 3 bills

将return所有账单。但我只想获取最新的 3 个元素,按 billdate 排序。我该怎么做?

在我看来,我想在 Django Rest Framework 中使用结果:

class OrderSerializer(serializers.ModelSerializer):

    class Meta:
        model = Order

        fields = (
            'id'
            'bill_set'
        )


class AffiliateOrderViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):

    serializer_class = OrderSerializer


    def get_queryset(self):
        return Order.objects.filter(bill_set__filter_somehow_only_the_last_3_entries_ordered_by_date)

有什么想法吗?

你可以简单地这样做

def get_queryset(self):
        return Order.objects.all()[0].bill_set.order_by('billdate')[:3]

或者你也可以这样做

def get_queryset(self):
    q1 = Order.objects.all()[0].bill_set
    q2 = q1.order_by('billdate')[0:3]
    return q2

您可以简单地在模型订单中添加属性

class Order(models.Model):
    user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)

    def get_number_of_last_bill(self, number):
        return self.bill_set.order_by("billdate")[:number]

在查询集中,调用这个:

order = Orders.objects.all()

order[0].get_number_of_last_bill(3) 
order[1].get_number_of_last_bill(3) 

在你的序列化器中,你可以像这样添加字段:

class BillSerializer(serializers.ModelSerializer):

    class Meta:
        model = Bill

        fields = (
            'id',
            'payed'
        )

class OrderSerializer(serializers.ModelSerializer):
    number_of_last_bill = serializers.SerializerMethodField()

    class Meta:
        model = Order

        fields = (
            'id',
            'bill_set',
            'number_of_last_bill',

        )
    def get_number_of_last_bill(self, obj):
        return BillSerializer(obj.get_number_of_last_bill(3), many=True).data