【问题标题】:Django: How to filter a subset in a querset?Django:如何过滤查询集中的子集?
【发布时间】:2021-01-18 10:47:50
【问题描述】:

如何过滤子集中的元素?

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

将退回所有账单。但我只想获取最新的 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)

有什么想法吗?

【问题讨论】:

    标签: django django-rest-framework subset django-queryset


    【解决方案1】:

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

    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
    

    【讨论】:

    • 谢谢。如何在我的 OrderSerializer 中将此方法与 django rest 框架一起使用?
    • 它对我不起作用。我得到一个' is not JSON serializable' 我想我需要一个序列化器来处理账单。
    • 我更新了我的答案,您可以添加BillSerializer 以获得json响应
    【解决方案2】:

    你可以这样做

    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
    

    【讨论】:

    • 感谢您的快速响应。我想我不够清楚。我想返回一个 Order 查询集。但是所有订单“对象”的 bill_set 最多应该有 3 个按日期排序的条目。
    猜你喜欢
    • 2019-12-04
    • 2016-02-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2020-08-22
    • 2019-04-15
    • 2011-09-29
    相关资源
    最近更新 更多