【发布时间】: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