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
如何过滤子集中的元素?
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