[英]check what field value changed in django model
我使用django-rest-framework ModelSerializer从一个宁静的API调用中解析数据。 这是代码:
url = "API URL HERE"
r = requests.get(url)
json = r.json()
serializer = myModelSerializer(data=json, many=True)
if serializer.is_valid():
serializer.save()
这是modelSerializer:
class myModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
我的型号:
class MyModel(models.Model):
City = models.NullBooleanField(default=False, null=True)
Status = models.CharField(max_length=100, null=True)
stateName = models.CharField(max_length=50)
marketingName = models.TextField(null=True)
county = models.CharField(max_length=200, null=True)
我的问题是,我需要找出自上次调用restful api和更新数据以来哪个字段值发生了变化。 或如果有任何新记录。 我该如何实现?
首先,您可以在MyModel
添加一列:
updated = models.DateTimeField(auto_now=True)
每当实例更改时,它都会更新。 如果您在查询集中对该字段进行过滤,则可以确定哪些行已更改以及是否有新行。
找出更改哪个字段比较困难,但这是一个主意-向模型添加一个字符串字段,并为模型编写自定义save
方法,如下所示:
class MyModel(models.Model):
City = models.NullBooleanField(default=False, null=True)
Status = models.CharField(max_length=100, null=True)
stateName = models.CharField(max_length=50)
marketingName = models.TextField(null=True)
county = models.CharField(max_length=200, null=True)
updated = models.DateTimeField(auto_now=True)
updated_fields = models.CharField(max_length=200, null=True)
def save(self, *args, **kwargs):
if not self.pk: # if this is new, just save
super(MyModel, self).save(*args, **kwargs)
else:
# get the original
old = MyModel.objects.get(id=self.pk)
# make a list of changed fields
changed_fields = []
for field in self._meta.get_all_field_names():
if getattr(self, field, None) != getattr(old, field, None):
if field not in ['updated', 'updated_fields']:
changed_fields.append(old)
# make a comma separated string
self.updated_fields = ','.join(changed_fields)
super(MyModel, self).save(*args, **kwargs)
现在, updated_fields
列将包含最近更新的字段集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.