我们正在尝试实现一个时态数据库,以便我们能够跟踪所做的更改
我们所有的模型都有以下字段
vt = models.DateTimeField(db_column='VT', default=datetime(3000, 12, 31, 23, 00, 00, 000000)) # Value To
vflag = models.IntegerField(db_column='VFlag', default=1) # Version Flag 1 = Current, 0 = Old
使用 Django 休息框架时,我尝试修改视图集中的 perform_update 以复制现有记录,进行更新,然后适当地设置时间字段。
当我有 1 条记录和第一次更新时它可以工作
但是,一旦我尝试进行第二次更新,它就会失败并创建更改的副本并覆盖第一条记录。
原始记录
Currency = AUD, VFlag = 1, VT = time1
执行更新 - 成功
Currency = USD, VFlag = 1, VT = time2
Currency = AUD, VFlag = 0, VT = time1
下一次执行更新当前产生 - 失败
Currency = GBP, VFlag = 1, VT = time3
Currency = GBP, VFlag = 1, VT = time3
Currency = USD , VFlag = 0, VF = time2
预期更新输出
Currency = GBP, VFlag = 1, VT = time3
Currency = USD, VFlag = 0, VT = time2
Currency = AUD, VFlag = 0, VT = time1
django rest 中是否有可能使用时态数据库?
有没有人能指出正确的方向
下面是我的视图集代码
class OptionMasterViewSet(viewsets.ModelViewSet):
serializer_class = OptionMasterSerializer
paginate_by = None
queryset = OptionMaster.objects.filter(vflag=1)
# queryset = OptionMaster.objects.all()
def get_queryset(self):
queryset = OptionMaster.objects.filter(vflag=1)
contractcode = self.request.query_params.get('contractcode', None)
if contractcode is not None:
queryset = queryset.filter(contractcode=contractcode, vflag=1)
return queryset
def perform_update(self, serializer):
changes = serializer.validated_data
original_object = serializer.instance
vt = datetime.now()
changes['vf'] = vt
#Build the old record
old_record = {}
for field in original_object._meta.get_fields():
old_record[field.name] = getattr(original_object, field.name)
old_record['vflag'] = 0
old_record['vt'] = vt
old_record = OrderedDict(old_record)
#Save the new rrecord
serializer.save()
#Create the old record
obj = OptionMaster.objects.create(**old_record)
return serializer
我的序列化
class OptionMasterSerializer(TemporalModelSerializer):
class Meta:
model = OptionMaster
fields = '__all__'
潜在的时间序列化器
class TemporalHyperlinkedModelSerializer(serializers.HyperlinkedModelSerializer):
vt = serializers.HiddenField(default=datetime(3000, 12, 31, 00, 00, 00, 000000))
vflag = serializers.HiddenField(default=1)
class TemporalModelSerializer(serializers.ModelSerializer):
vt = serializers.HiddenField(default=datetime(3000, 12, 31, 23, 00, 00, 000000))
vflag = serializers.HiddenField(default=1)
class TemporalModel(models.Model):
vt = models.DateTimeField(db_column='VT') # Field name made lowercase.
vflag = models.IntegerField(db_column='VFlag') # Field name made lowercase..
class Meta:
abstract = True