Vin*_*rio 3 python django django-rest-framework
我目前正在使用 Django REST Framework 3.11.0 和 Django 3.0.6。我对 DRF 还很陌生,不知道如何解决这个问题。我正在尝试将排序应用于 SerializerMethodField 和枚举。我找到了一些文档,说明我可以制作自己的 OrderFilter,但我不知道如何制作。有什么我可以使用的例子吗?这是我的代码。
看法
from rest_framework import generics
from V1.assets.models.asset_main import Asset
from V1.assets.serializers.asset_serializer import AssetSerializer
from rest_framework import filters
from django_filters.rest_framework import DjangoFilterBackend
class AssetsView(generics.ListCreateAPIView):
queryset = Asset.objects.all()
serializer_class = AssetSerializer
filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
filter_fields = ['asset_type']
search_fields = ['asset_type', 'asset_properties', 'current_employee_name']
Run Code Online (Sandbox Code Playgroud)
模型
class AssetType(models.TextChoices):
LAPTOP = 'LPT', _('Laptop')
MOUSE = 'MSE', _('Mouse')
MONITOR = 'MTR', _('Monitor')
AC_ADAPTER = 'ADR', _('AC Adapter')
TELEPHONE = 'TLP', _('Telephone')
LOCK = 'LCK', _('Lock')
HEADSET = 'HDS', _('Headset')
class Asset(CreatedModified):
asset_type = models.CharField(
max_length=3,
choices=AssetType.choices,
default=None
)
asset_properties = JSONField(default=dict)
current_employee = models.ForeignKey(
Employee,
related_name='assets_current_employees',
related_query_name='assets_current_employee',
default=None,
on_delete=models.CASCADE,
null=True,
blank=True
)
class Meta:
app_label = 'assets'
default_related_name = 'assets'
def __str__(self):
return self.asset_type
Run Code Online (Sandbox Code Playgroud)
串行器
from V1.general.enums import AssetStatus, AssetType
from V1.accounts.models.employee_main import Employee
class AssetSerializer(serializers.ModelSerializer):
current_employee_name = serializers.SerializerMethodField('get_full_name_from_employee')
asset_type = serializers.CharField(source='get_asset_type_display')
class Meta:
model = Asset
fields = (
'id',
'asset_type',
'asset_properties',
'current_employee',
'current_employee_name'
)
extra_kwargs = {
'asset_type': {
'required': True,
'allow_blank': False
}
}
def get_full_name_from_employee(self, asset):
current_employee_name = asset.current_employee.first_name + ' ' + asset.current_employee.last_name
return current_employee_name
Run Code Online (Sandbox Code Playgroud)
我似乎无法通过current_employee_name或订购asset_type。我应该怎么做才能允许对这两个字段进行排序?
据我从您的问题中了解到,您想按当前员工姓名订购资产。我们以几个名字为例:
如果我们先按 排序first_name,然后再按 排序,则可以实现相同的排序last_name。如果有多个条目相同,first_name则按last_name.
要实现这一点,您只需ordering_fields在您的视图中指定:
class AssetsView(generics.ListCreateAPIView):
filters = [filters.OrderingFilter]
ordering_fields = ['current_employee.first_name', 'current_employee.last_name']
Run Code Online (Sandbox Code Playgroud)