

DRFでのレコード件数取得についてお知恵をお貸しください

要点は以下の２点  
・対象データのレコード件数を下記「得たい出力結果１～３」のように表示したい  
・URLのクエリストリングでフィルタリングしたデータの件数を表示したい

現在の構成は以下の通りです

●models.py

[code]

    class Project(models.Model):
    pid = models.IntegerField()
    code = models.CharField(unique=True, max_length=16, db_collation='utf8mb4_bin')
    name = models.CharField(max_length=255)
    detail = models.CharField(max_length=255, blank=True, null=True)
    
    class Meta:
        managed = False
        db_table = 'project'
        constraints = [
            models.UniqueConstraint(
                fields=['pid', 'code'],
                name='pid_code_unique'
            ),
        ]
    
[/code]

●serializer.py

[code]

    class ProjectSerializer(serializers.ModelSerializer):
    project_counts = serializers.SerializerMethodField()
    
    def get_project_counts(self, obj):
        return Projecttest.objects.filter().count()
    
    class Meta:
        model = Projecttest
        fields = ('pid', 'code', 'project_counts',)
    
[/code]

●views.py

[code]

    class ProjecttestViewSet(viewsets.ModelViewSet):
    queryset = Project.objects.all()
    serializer_class = ProjecttestSerializer
    filterset_fields = ['pid','code','main','sub']
    
[/code]

上記での出力結果1（URL：http://example/）

[code]

    [
        {
            "pid": 2,
            "code": "001",
            "project_counts": 7
        },
        {
            "pid": 2,
            "code": "002",
            "project_counts": 7
        },
        {
            "pid": 1,
            "code": "001",
            "project_counts": 7
        },
        {
            "pid": 1,
            "code": "002",
            "project_counts": 7
        },
        {
            "pid": 3,
            "code": "001",
            "project_counts": 7
        },
        {
            "pid": 3,
            "code": "002",
            "project_counts": 7
        },
        {
            "pid": 3,
            "code": "003",
            "project_counts": 7
        }
    ]
    
[/code]

上記での出力結果２（URL：http://example/?pid=1&code=002）

[code]

    [
        {
            "pid": 1,
            "code": "001",
            "project_counts": 7 <---pid=1&code=002で絞り込んだ件数ではなく全レコード数が表示
        },
        {
            "pid": 1,
            "code": "002",
            "project_counts": 7 <---pid=1&code=002で絞り込んだ件数ではなく全レコード数が表示
        }
    ]
    
[/code]

以下の出力を得たい

得たい出力結果1（URL：http://example/）

[code]

    {
        "project_counts": 7,  <---全レコード件数
        "data": [
            {
                "pid": 2,
                "code": "001"
            },
            {
                "pid": 2,
                "code": "002"
            },
            {
                "pid": 1,
                "code": "001"
            },
            {
                "pid": 1,
                "code": "002"
            },
            {
                "pid": 3,
                "code": "001"
            },
            {
                "pid": 3,
                "code": "002"
            },
            {
                "pid": 3,
                "code": "003"
            }
        ]
    }
    
[/code]

得たい出力結果２（URL：http://example/?pid=1&code=002）

[code]

    {
        "project_counts": 1,  <---pid=1&code=002で絞り込んだ件数
        "data": [
            {
                "pid": 1,
                "code": "002"
            }
        ]
    }
    
[/code]

得たい出力結果３（URL：http://example/?pid=1）

[code]

    {
        "project_counts": 2,  <---pid=1で絞り込んだ件数
        "data": [
            {
                "pid": 1,
                "code": "001"
            },
            {
                "pid": 1,
                "code": "002"
            }
        ]
    }
    
[/code]


CC BY-SA 4.0
2023-02-17T05:30:25.037
93887
2023-02-17T06:31:52.560
2023-02-17T06:31:52.560
3060
57022
question
django django-rest-framework
Django Rest Framework : URLパラメータをfilter()に渡してレコード件数を表示する方法