2016-07-25 14 views
0

私は最近、Djangoの開発を開始しました.Django REST Frameworkとクラスベースのビューを使用してAPIを構築しています。 モデルを結合し、時間に基づいてそれらをソートし、テーブル名が付加されたAPIにフィールドのサブセットを返す方法を探しています。Django REST Framework - モデルのないシリアル化による表示

現在、私は次のようしている:

views.py

class RunLog(APIView): 
     """ 
     List log for a specific run sorted in reverse chronological order 
     """ 
     def get(self, request, run_id, format=None): 
      # Combine and sort based on time (decreasing) 
      result_list = sorted(chain(Output.objects.filter(run=run_id), 
             Downtime.objects.filter(run=run_id)), 
           key=attrgetter('start_time'), reverse=True) 

      // Replace this with serializer?? 
      response = Response(serializers.serialize('json', result_list), status=status.HTTP_200_OK) 
      return response 

models.py

class Output(models.Model): 
    start_time = models.DateTimeField(default=datetime.now) 
    value = models.FloatField() 

    run = models.ForeignKey(Run, blank=True, null=True) 

    def __unicode__(self): 
     return str(self.id) 

class Downtime(models.Model): 
    start_time = models.DateTimeField(default=datetime.now) 
    end_time = models.DateTimeField(null=True, blank=True) 
    reason = models.CharField(max_length=500) 

    run = models.ForeignKey(Run, blank=True, null=True) 

私は、次のJSONを取得する:

"[{\"model\": \"app.downtime\", \"pk\": 91, \"fields\": {\"start_time\": \"2016-07-20T14:46:21Z\", \"end_time\": null, \"reason\": \"reason1\", \"run\": 71}}, {\"model\": \"app.downtime\", \"pk\": 101, \"fields\": {\"start_time\": \"2016-07-20T14:46:21Z\", \"end_time\": null, \"reason\": \"reason2\", \"run\": 71}}]" 

私は考え好きな次のようなJSON形式でこのデータをシリアル化するために:

[ 
     { 
      "id": 231, 
      "type": "speed", 
      "description": "Some description", 
      "time": "2016-07-21T21:26:26Z" 
     } 
    ] 

**Where type is the database table and description is concatenated columns from a model. 

私は運なしドキュメントとthis similar question見てきました。

+0

あなたはModelObj._meta.db_table' '経由でDBのテーブル名にアクセスすることができます。 – IanAuld

+0

私が気づいている最大の問題は、データのフォーマット方法です。 (values()を使用して)モデルからいくつかのフィールドを取り出し、それらを新しいフィールド名にプッシュし、さらにフィールドを追加して(ModelObj._meta.db_tableを介してtablename)、それをレスポンスとして送信することができます。 – Matt

+0

'def your_serializer(obj):return dict(id = obj.id、type =" type "、...)'? – IanAuld

答えて

0

コメントでIanAuldが提案したように - ModelObj._meta.db_tableはテーブルの名前を取得しました。私はその後、views.pyに辞書のソートされたリストを作成しました:

speedList = Speed.objects.filter(run=run_id) 
type = Speed._meta.db_table.split('_', 1)[1] 
type = type[0].upper() + type[1:] 

for speed in speedList: 
    description = "Speed change to %.2f (units)" % speed.value 
    logList.append({'id':speed.id, 'type':type, 'description':description, 'time':speed.start_time}) 

# Sort list by decreasing time 
resultList= sorted(logList, key=itemgetter('time'), reverse=True) 

serializer = LogSerializer(resultist, many=True) 
return Response(serializer.data) 

serializers.py:

class LogSerializer(serializers.Serializer): 
    id = serializers.IntegerField() 
    type = serializers.CharField(max_length=100) 
    description = serializers.CharField(max_length=500) 
    time = serializers.DateTimeField() 
関連する問題