这是我的模型:

class Log(models.Model):
    user = models.OneToOneField(UserProfile, verbose_name='user', on_delete=models.CASCADE)
    log = models.JSONField(verbose_name='log', default=list, null=True, blank=True)

    def __str__(self):
        return self.user.username

数据(log.log)如下所示:

[
  {"date": "2021-1-1", "volume": 123},
  {"date": "2021-2-1", "volume": 456}, // if post date is 2021-2-1, i want delete this
  {"date": "2021-3-1", "volume": 789}
]

此删除视图:

    def delete(self, request, *args, **kwargs):
        date = request.data.get('date', None)
        if not date:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        user = request.user
        log = Log.objects.filter(user=user).first()
        if not log:
            return Response(status=status.HTTP_404_NOT_FOUND)
        
        # delete data based on date
        # data = json.dumps(log.log)
        ...
        return Response(status=status.HTTP_200_OK)

我不擅长json,try 了一些方法但失败了.

非常感谢您的回答

推荐答案

def delete(self, request, *args, **kwargs):
    date = request.data.get('date', None)
    if not date:
        return Response(status=status.HTTP_400_BAD_REQUEST)
    user = request.user
    log = Log.objects.filter(user=user).first()
    if not log:
        return Response(status=status.HTTP_404_NOT_FOUND)
    
    log.log = [
        item for item in log.log
        if item['date'] != date
    ]
    log.save()
    return Response(status=status.HTTP_200_OK)

但是,如果数据是 struct 化的,就像JSON数据一样,在关系数据库中使用额外的模型更好,因此:

class LogEntry(models.Model):
    log = models.ForeignKey(Log, on_delete=models.CASCADE)
    date = models.DateField()
    volume = models.IntegerField()

事实上,在这种情况下,log没有意义,你可以直接参考UserProfile.这将使数据库的更新更有效,而且数据库可以验证数据,例如通过防止在date字段中存储非日期的内容.

如果使用JSON blob,我们将完全反序列化blob,删除条目,然后再次序列化结果.因此,它以entire个blob的大小线性zoom ,而不是以要删除的记录的大小线性zoom .


Note:通常使用settings.AUTH_USER_MODEL [Django-doc]来表示用户模型比直接使用User model [Django-doc]更好.有关更多信息,请参阅referencing the User model section of the documentation.

Json相关问答推荐

JoltChange:将输入数组的每个对象拆分为2个独立的对象,并将其放入输出数组中

在T—SQL中将STR_AGG与JSON_ARRAY结合起来

服务器不返回JSON

给定一个包含两个数组的JSON输入文件,如何使用Jolt将一个数组中的每个元素与另一个数组组合在一起?

如何在JSONata对象中迭代并向数组添加新字段?

使用 Redis 作为键值存储

报告重复的对象键

JOLT分裂和数组数据

使用 jq 工具将文本从 txt 文件转换为 json

下一个 Js 部署在 getStaticPath 函数上失败:在 JSON.parse 的位置 0 的 JSON 中出现意外的令牌 < 但在本地运行

使用 json 值过滤 Django 模型

如何使用 ConfigurationBuilder 解析现有的 json 字符串(不是文件)

Jolt - 在同一级别添加时组合值的问题

如何使用 jackson 反序列化为 Kotlin 集合

在 JSON 反序列化期间没有为System.String类型定义无参数构造函数

如何通过 NSJSONSerialization 在 JSON 中包含空值?

在 Postgres 中向 JSON 对象添加元素

Jackson 没有使用 @JsonProperty 覆盖 Getter

JSON 格式的 Amazon S3 响应?

来自 Gson 的 JSON 字符串:删除双引号