繁体   English   中英

检查Django模型中哪些字段值更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM