2017-01-10 17 views
1

我有一個模型如何提供API以獲取django-rest中任何模型中所做更改的歷史記錄?

class Project(models.Model): 
    STATUS_CHOICE= (('going_on','GOING_ON'), 
        ('project_co','PROJECT_COMPLETED'), 
        ('contract_c','CONTRACT_COMPLETED'), 
        ('contract_e','CONTRACT_EXTENDED'), 
        ) 
    title= models.CharField(max_length=30,unique=True) 
    description= models.CharField(max_length=2000,null=True,blank=True) 
    assigned_date= models.DateField(null=True, blank=True) 
    completion_date= models.DateField(null=True, blank=True) 
    join_date= models.DateField(null=True, blank=True) 
    technology= models.ForeignKey(Technology,null=True, blank=True) 
    consultant= models.ForeignKey(User, on_delete=models.CASCADE, related_name= 'project') 
    status= models.CharField(max_length= 10, choices= STATUS_CHOICE, default= 'pending') 
    file=models.FileField(upload_to=get_attachment_file_path,null=True,blank=True) 
    history = HistoricalRecords() 

現在我想跟蹤這個項目模型的所有更改。我已經使用django-simple-history

但它提供了有限的功能。我知道我可以在Django中使用信號。但是我必須發送歷史數據,以便通過特定的user與該項目各自的STATUS_CHOICE完成了多少個項目。

+0

你可以有另一種模型的追蹤所有的變化是是正確的?對於每次保存,您都可以使用更改更新模型。 –

+0

curently我爲此目的使用django-simple-history,但有人可以告訴我如何從django-simple-history獲取每個更改實例的日期時間。 – amrit

回答

2

我認爲這可以解決。它應該是體面有效的,即使你有數百萬行。


models.py

from django.utils import timezone 

class Change(models.Model): 
    project = models.ForeignKey(Project) 
    changed_field = models.CharField("field_name") 
    changed_data = models.TextField() # you can improve this by storing the data in compressed format 
    chaged_at = models.DateTimeField(default=timezone.now) 
    status = models.CharField(max_length= 10, choices= STATUS_CHOICE, default= 'pending') 

serializers.py

class ChangeSerializer(serializers.ModelSerializer): 
    class Meta: 
      model = Change 
      fields = ("project","changed_field",# all the other fields that you wanna add) 

views.py

def get_changes(request,project_id,status): 
    if request.method == 'GET': 
    changes = Change.objects.filter(status=status, project=Project.objects.get(pk=project_id)) 
    serializer = ChangeSerializer(changes, many=True) 
    return JSONResponse(serializer.data) 

urls.py

urlpatterns = [ 
    url(r'changes/(?P<project_id>\d+)/(?P<status>[a-z]+)/',views.get_changes) 
] 

讓我知道,如果你想要的任何其他更改

+0

可以給你一些關於如何在視圖中寫這個東西的細節... – amrit

相關問題