

Django REST Frameworkでマスタからデータを取得するAPIを作成しています。  
models.py

[code]

    class CommonMaster(models.Model):
        type = models.CharField(max_length=20)
        type_id = models.IntegerField()
        key_name = models.CharField(max_length=20)
        value = models.CharField(max_length=1024,null=True)
    
[/code]

レコード：

[code]

    {"id":"1", "type":"cat", "type_id":"1", "key_name":"Breed", "value":"Somali"}
    {"id":"2", "type":"cat", "type_id":"1", "key_name":"Country", "value":"Canada"}
    {"id":"3", "type":"cat", "type_id":"2", "key_name":"Breed", "value":"Bengal"}
    {"id":"4", "type":"cat", "type_id":"2", "key_name":"Country", "value":"America"}
    {"id":"5", "type":"dog", "type_id":"1", "key_name":"Breed", "value":"Shiba"}
    {"id":"6", "type":"dog", "type_id":"1", "key_name":"Country", "value":"Japan"}
    
[/code]

views.py

[code]

    class CommonMasterViewSet(viewsets.ReadOnlyModelViewSet):
        serualizer_class = ListSerializer
    
        def get_queryset(self):
            return CommonMaster.objects.all()\
                               .filter(type=self.request.query_params['type'])\
                               .filter(key_name=self.request.query_params['type_id'])
    
[/code]

serializer.py

[code]

    class ListSerializer(serializers.Serializer):
        def to_representation(self, obj):
            return {
                obj.key_name : obj.value
            }
    
[/code]

現在、取得結果は

[code]

    [
        {
            "Breed": "Bengal"
        },
        {
            "Country": "America"
        }
    ]
    
[/code]

のようになるのですが、以下のような形式でJSONを返したいと考えています。

[code]

    [
        {
            "Breed": "Bengal",
            "Country": "America"
        },
    ]
    
[/code]

Serializerの修正のみで実現可能でしょうか。  
解決法がありましたらご教授いただけないでしょうか。よろしくお願いします。


CC BY-SA 4.0
2018-08-02T07:29:06.220
47188
2023-02-17T06:28:54.717
2023-02-17T06:28:54.717
3060
29561
question
python django django-rest-framework
Django REST Framework:Serializerで取得結果を１つのリストにする


`Serializer`の修正とかいろいろ考えていると難しくなるのですが、`Flask`でストレートに書くと簡単に書けます。

[code]

    from flask import Flask
    app = Flask(__name__)
    from sqlalchemy import create_engine
    engine  = create_engine('接続文字列')
    
    @app.route('/queryset')
    def queryset():
        result = engine.execute('SELECT type, key_name FROM table_name')
        s = '[{' + ','.join(map(lambda x: f'"{x.type}":"{x.key_name}"', result)) + '}]'
        return Response(s, mimetype='application/json')
    
[/code]

また、キーに重複がないのならば辞書が使えるのでもっと簡単です。

[code]

    import json
    from flask import Flask
    app = Flask(__name__)
    from sqlalchemy import create_engine
    engine  = create_engine('接続文字列')
    
    @app.route('/queryset')
    def queryset():
        result = engine.execute('SELECT type, key_name FROM table_name')
        return Response('[' + json.dumps(dict(list(result))) + ']', mimetype='application/json')
    
[/code]

`Dgjango`でも難しく考えないで同じように書けばいいのではないでしょうか（`Dgjango`は使ったことがないのでよくわかりませんが、Viewsで`serializer`を使わないで`CommonMaster`から直接文字列を作成してそれを返すようにすればいいと思います）。


CC BY-SA 4.0
2018-08-04T07:53:09.257
47236
2018-08-06T00:44:20.383
2018-08-06T00:44:20.383
15171
15171
47188
answer