2016-11-22 41 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()来完成的。

相关问题