【问题标题】:Issues with the addition of duplicate items by django_rest_framework ListSerializerdjango_rest_framework ListSerializer 添加重复项的问题
【发布时间】:2017-07-11 22:53:38
【问题描述】:

我正在结合使用 PhoneGap 应用和基于 Django 的后端来记录研究项目的位置数据点。

PhoneGap 应用将捆绑多个数据点并将它们推送到 django-rest-framework API 端点,例如:

[{
    "speed": -1,
    "time": 1487292133229.221,
    "longitude": 172.123456,
    "bearing": -1,
    "location_type": "current",
    "latitude": -43.123456,
    "accuracy": 65,
    "heading": -1,
    "altitude": 3.585018873214722,
    "altitudeAccuracy": 10
}, ...
]

但是,由于 PhoneGap 应用程序管理位置的方式,许多点在推送的 JSON 中重复。

为了尝试解决这个问题,我重写了 ListSerializer 以遍历传入的数据,并通过计算基于时间戳和用户 ID(谁上传它),然后查看是否已经存在具有相同哈希值的东西。采用这种方法是因为实际位置数据在添加到数据库之前已加密。

class DatumListSerializer(serializers.ListSerializer):

    def create(self, validated_data):
        """ Only append objects if the count of existing objects is 0 (i.e. it is unique),
            and it does not appear elsewhere in the list to be committed. """
        objects = []

        for obj in validated_data:
            hashed_value = generate_hash(obj['timestamp'], obj['user'].id)

            if Datum.objects.filter(hash=hashed_value).count()==0:
                objects.append(Datum.objects.create(user=obj.pop('user').id, **obj))

        return objects

这种方法可以捕获大部分重复项,但不是全部。是否有人对可能导致添加非重复项的原因有任何想法?我是否应该对 Datum 模型的“哈希”字段设置唯一约束,然后默默地忽略导致 IntegrityError 的插入?

感谢您的想法!

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    由于您的 json 本身已被重复损坏。我建议您在后端(django)收到它后首先清理您的 json。您可以尝试这里给出的方法 - https://stackoverflow.com/a/33955470/4815238

    一旦 JSON 干净,然后创建所需的对象。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2021-07-07
      • 2020-12-21
      • 2021-02-12
      • 1970-01-01
      相关资源
      最近更新 更多