2016-11-22 3 views
2

Ich benutze Django-Simple-Geschichte (1.8.1) und DRF (3.5.3). Ich möchte einen Ruhe-Service erhalten, der die Geschichte jedes Elements enthält. Nehmen wir ein Beispiel!Erhalten Rest Geschichte von Django einfach Geschichte

models.py

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

    def __str__(self): 
     return self.name 

Also, was muss serializers.py sein? Ich möchte wie etwas bekommen:

[ 
    { 
     "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 
      } 
     ] 
    } 
] 

Nach der Suche whitout die Lösung zu finden, fand ich schließlich, es selbst. Aber wenn jemand eine bessere Lösung hat ...

Antwort

4

Hier ist meine Lösung. In 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 

Es funktioniert! Ich bin ziemlich stolz darauf! irgendwelche Vorschläge ?

0

Ich weiß, es war ein Jahr, aber irgendwie findet es vielleicht jemand nützlich. Hier ist meine Lösung (es viel einfacher, mir scheint):

Ein neues Serializer Feld:

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

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

Jetzt einfach verwenden Sie es als aa Feld in Ihrem Serializer:

history = HistoricalRecordField(read_only=True) 

Dies macht den Einsatz von DRF eingebaut in list und dict Serialisierer, ist nur Trick, um es die richtige iterable, die durch den Aufruf .values() in der Simple-History-Modell-Manager-Klasse getan wird.