Django Rest框架。按序列化方法排序

问题描述 投票:0回答:1

我目前使用的是Django REST框架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'] 

型号

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

序列器

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

我似乎不能按 current_employee_nameasset_type. 我应该怎么做才能让这两个字段排序?

python django django-rest-framework
1个回答
3
投票

据我所知,你想对你的问题进行排序。资产 由当前员工的姓名。我们以几个名字为例。

  • Jean d'Artagnan (名: Jean, 姓: d'Artagnan)
  • 乔-管道工(名:乔,姓:管道工)。
  • Jonas Meyer (名:Jonas, 姓:Meyer)

如果我们先按以下方式排序,也可以达到同样的排序效果 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']
© www.soinside.com 2019 - 2024. All rights reserved.