我正在使用 django rest 框架,我想使用自定义方法进行订购。
所以,当我调用这个 url 例如:http: //127.0.0.1 :8000/api/sets/?ordering=partMissing
可以调用自定义方法,因为我想用代码段缺少的零件数进行订购。我计算了多对多字段中部分的总和。
原文由 mart_- 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在使用 django rest 框架,我想使用自定义方法进行订购。
所以,当我调用这个 url 例如:http: //127.0.0.1 :8000/api/sets/?ordering=partMissing
可以调用自定义方法,因为我想用代码段缺少的零件数进行订购。我计算了多对多字段中部分的总和。
原文由 mart_- 发布,翻译遵循 CC BY-SA 4.0 许可协议
我认为 opalczynski 的解决方案更简单的方法是引入一个用于自定义排序的新字段:
from django import forms
import django_filters
from rest_framework import serializers
from .models import MyModel
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ('field1',)
class CustomOrderingFilter(django_filters.FilterSet):
order_by = django_filters.BooleanFilter(
widget=forms.HiddenInput(),
method='filter_order_by',
)
class Meta:
model = MyModel
fields = [
'order_by'
]
def filter_order_by(self, queryset, name, value):
if value:
return self.Meta.model.objects.filter(
id__in=queryset.values_list('id', flat=True)
).order_by(value)
return queryset
class TestViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
filter_class = CustomOrderingFilter
然后您可以轻松地按您想要的任何字段进行排序: example.com/api/mymodel/?order_by=partMissing
。
在我的示例中,我使用了固定模型字段,但您可以在 --- 的 CustomOrderingFilter
filter_order_by
方法中更改订购方式。只需将其更改为您想要的逻辑,但请确保使用 .filter(=queryset.values_list('id', flat=True))
以确保正在使用已设置的其他过滤器。
原文由 Özer 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
我有非常简单的 POC,应该允许您实施更复杂的解决方案。
views.py
:ordering.py
:models.py
和serializers.py
很简单,但我仍将它们包括在这里:models.py
:serializers.py
:编码愉快!