2016-11-22 157 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

我知道這是一年,但無論如何,也許有人認爲它有用。這裏是我的解決方案(它似乎更容易對我來說):

一個新的串行領域:

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

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

現在只是把它作爲你的串行AA場:

history = HistoricalRecordField(read_only=True) 

這使得使用DRF的內建listdict序列化器,唯一的訣竅是將它傳遞給正確的迭代器,這是通過在簡單歷史模型管理器類上調用.values()來完成的。