【问题标题】:check what field value changed in django model检查 django 模型中更改了哪些字段值
【发布时间】:2026-02-20 11:45:01
【问题描述】:

我使用 django-rest-framework ModelSerializer 解析来自 RESTful 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 和更新数据以来发生了哪些字段值变化。或 如果有任何新记录。我如何做到这一点?

【问题讨论】:

  • 这与django 关系更大,与django-rest-framework 关系不大。

标签: python django django-rest-framework


【解决方案1】:

首先,您可以在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 列将包含上次更新的字段集。

【讨论】:

  • 当我执行 serializer.save() 时,我收到带有 id 的 myModel 已经存在的错误。看起来序列化程序不允许我更新同一行。
  • 你序列化的json长什么样子?
  • 在你输入自定义保存方法之前是否给你这个错误?
  • 错误是当我调用这个时: if serializer.is_valid(): serializer.save() 序列化器无效,因为带有pk的记录已经存在。
  • 这里是来自 api 的数据:w3.org/2001/XMLSchema-instance" xmlns=""> 10015620120207南方公园AlleghenyMD
最近更新 更多