2016-11-22 14 views
2

私はdjango-simple-history(1.8.1)とDRF(3.5.3)を使用しています。私は各要素の歴史を含む休憩サービスを受けたいと思っています。例を見てみましょう!Djangoからの休息履歴を取得する簡単な履歴

models.py

class Product(models.Model): 
    name = models.CharField(max_length=50) 
    price = models.IntegerField() 
    history = HistoricalRecords() 

    def __str__(self): 
     return self.name 

だから、何がserializers.pyでなければなりませんか?私のような何かを取得したいのですが:

[ 
    { 
     "id": 1, 
     "name": "Apple", 
     "price": 8, 
     "history": [ 
      { 
       "history_id": 1, 
       "id": 1, 
       "name": "Apple", 
       "price": 0, 
       "history_date": "2016-11-22T08:02:08.739134Z", 
       "history_type": "+", 
       "history_user": 1 
      }, 
      { 
       "history_id": 2, 
       "id": 1, 
       "name": "Apple", 
       "price": 10, 
       "history_date": "2016-11-22T08:03:50.845634Z", 
       "history_type": "~", 
       "history_user": 1 
      }, 
      { 
       "history_id": 3, 
       "id": 1, 
       "name": "Apple", 
       "price": 8, 
       "history_date": "2016-11-22T08:03:58.243843Z", 
       "history_type": "~", 
       "history_user": 1 
      } 
     ] 
    } 
] 

解決策を見出すwhitout検索した後、私は最終的に自分でそれを見つけました。しかし、誰かがより良いソリューションを持っている場合...

答えて

4

私の解決策です。 でserializers.py

from rest_framework import serializers 
from .models import Product 


class sHistory(serializers.ModelSerializer): 
    def __init__(self, model, *args, fields='__all__', **kwargs): 
     self.Meta.model = model 
     self.Meta.fields = fields 
     super().__init__() 

    class Meta: 
     pass 


class sProduct(serializers.ModelSerializer): 
    class Meta: 
     model = Product 
     fields = '__all__' 

    history = serializers.SerializerMethodField() 

    def get_history(self, obj): 
     model = obj.history.__dict__['model'] 
     fields = ['history_id', ] 
     serializer = sHistory(model, obj.history.all().order_by('history_date'), fields=fields, many=True) 
     serializer.is_valid() 
     return serializer.data 

それは働きます!私はそれについてかなり誇りに思います!助言がありますか ?

0

私はそれが1年であることを知っていますが、とにかく誰かがそれが有用であると知っているかもしれません。ここに私の解決策は、(それは私にははるかに簡単と思われる)である:

新しいシリアライザフィールド:

class HistoricalRecordField(serializers.ListField): 
child = serializers.DictField() 

def to_representation(self, data): 
    return super().to_representation(data.values()) 

今、単にあなたのシリアライザにAAフィールドとしてそれを使用する:

history = HistoricalRecordField(read_only=True) 

これは、利用していますlistdictシリアライザで構築されたDRFのうち、シンプルヒストリーモデルマネージャクラスで.values()を呼び出すことによって行われている正しいイテラブルをトリックに渡すだけです。

関連する問題