Django Rest框架如何過濾嵌套數據?

我想過濾嵌套數據,這些是我的序列化程序和視圖

Models :

class Employee(models.Model):
    employee_identity = models.CharField(max_length=255, blank=True, null=True)
    full_name = models.CharField(max_length=255, blank=True, null=True)
    place_birth = models.CharField(max_length=255, blank=True, null=True)
    date_birth = models.DateField(blank=True, null=True)
    role = models.CharField(max_length=255, blank=True, null=True)
    no_hp = models.CharField(max_length=255, blank=True, null=True)
    address = models.CharField(max_length=255, blank=True, null=True)
    class Meta:
        managed = False
        db_table = 'employee'

class Penalty(models.Model):
    employee = models.ForeignKey(Employee,on_delete=models.CASCADE)
    type = models.CharField(max_length=255, blank=True, null=True)
    start_date = models.DateField(blank=True, null=True)
    end_date = models.DateField(blank=True, null=True)
    doc = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'penalty'

Serializers :

class PenaltySerializer (serializers.ModelSerializer):
    employee_identity = serializers.CharField(source="employee.employee_identity")
    month = serializers.SerializerMethodField()
    year = serializers.SerializerMethodField()

    def get_month(self,obj):
        value_start_date = obj.start_date
        month_value = value_start_date.strftime("%b")
        return bulan_value
    def get_year(self,obj):
        value_start_date = obj.start_date
        year_value = value_start_date.strftime("%Y")
        return year_value
    class Meta:
        model = Penalty
        fields = ('id','employee','employee_identity','type','start_date','end_date','month','year') 

class EmployeeSerializer (serializers.ModelSerializer):
    penalty = PenaltySerializer(many=True,read_only=True)

    class Meta:  
        model = Employee
        fields =  ('employee_identity','full_name','penalty')

Views:

class EmployeeViewSet(viewsets.ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = PegawaiSerializer
    http_method_names = ['get','head']
    pagination_class = LimitPagination

class PenaltyViewSet(viewsets.ModelViewSet): 
    queryset = Penalty.objects.all()
    serializer_class = PenaltySerializer
    http_method_names = ['get','head']
    pagination_class = LimitPagination
    filter_backends = [filters.SearchFilter,DjangoFilterBackend]
    filter_fields = ['employee','type']
    search_fields = ['^start_date']

class DetailDataEmployeeViewSet(viewsets.ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializer
    http_method_names = ['get','head']
    pagination_class = LimitPagination
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['id','employee_identity']

結果我沒有日期過濾器

 "results": [
         {
             "id": 13886,
             "employee_identity": "A3014",
             "full_name": "AAAA",
             "penalty": []
         },
         {
             "id": 13887,
             "employee_identity": "A3015",
             "full_name": "BBB",
             "penalty": [
               {
                     "id": 1,
                     "employee": 20924,
                     "employee_identity": "A3015",
                     "type": "low",
                     "start_date": "2021-01-01",
                     "end_date": "2021-01-02",
                     "month": "Jan",
                     "year": "2021"
                 },
                 {
                     "id": 2,
                     "employee": 20924,
                     "employee_identity": "A3015",
                     "type": "low",
                     "start_date": "2021-02-11",
                     "end_date": "2021-02-12",
                     "month": "Feb",
                     "year": "2021"
                 }
              ]
         }

以及按日期篩選數據所需的結果(例如:filter date:2021-01)

"results": [
            {
                "id": 13886,
                "employee_identity": "A3015",
                "full_name": "BBB",
                "penalty": [
                  {
                        "id": 1,
                        "employee": 20924,
                        "employee_identity": "A3015",
                        "type": "low",
                        "start_date": "2021-01-01",
                        "end_date": "2021-01-02",
                        "month": "Jan",
                        "year": "2021"
                    }
                 ]
            }

我可以基于DetailDataEmployeeViewSet中的DjangoFilterBackend生成結果,但我不知道如何按日期生成懲罰數據。我該怎么做?提前謝謝。

? 最佳回答:

一個簡單的解決方案是擴展ViewSet的filter_queryset方法

class DetailDataEmployeeViewSet(viewsets.ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializer
    http_method_names = ['get','head']
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['id','employee_identity']

    def filter_queryset(self, queryset):
        queryset = super().filter_queryset(queryset)
        start_date = self.request.query_params.get("start_date", None)

        if start_date is not None:
            print(start_date)
            queryset = queryset.filter(penalty__start_date=start_date)

        return queryset

usage:

GET /employee/?start_date=2021-02-27

主站蜘蛛池模板: 国产在线观看一区二区三区 | 国产乱码精品一区二区三区四川人 | 日韩亚洲一区二区三区| 亚洲国产老鸭窝一区二区三区| 亚洲福利视频一区二区| 国模精品一区二区三区视频| 99久久综合狠狠综合久久一区| 国语精品一区二区三区| 国产在线一区二区杨幂| 加勒比无码一区二区三区| 久久久久人妻精品一区二区三区 | 亚洲一区二区成人| 国产成人无码AV一区二区| 一区二区三区日本电影| 风流老熟女一区二区三区| 国产成人高清亚洲一区久久| 99国产精品欧美一区二区三区| 日韩最新视频一区二区三| 亚洲一区精品视频在线| 少妇无码一区二区三区免费| 亚洲国产精品第一区二区| 久久久久久人妻一区精品| 久久精品道一区二区三区| 国产成人精品一区二区三区免费| 亚洲色欲一区二区三区在线观看| A国产一区二区免费入口| 手机看片福利一区二区三区| 成人免费一区二区三区| 亚洲老妈激情一区二区三区| 亚洲AV福利天堂一区二区三 | 日韩精品一区二区午夜成人版| 国产在线精品一区二区| 国产伦精品一区二区免费| 一本大道东京热无码一区| 无码日韩精品一区二区免费暖暖| 色婷婷一区二区三区四区成人网| 色噜噜狠狠一区二区| 在线视频精品一区| 亚洲一区无码精品色| 日本不卡免费新一区二区三区| 精品无码人妻一区二区三区品|