Я использую комбинацию приложения PhoneGap и базы данных на основе Django для записи точек данных местоположения для исследовательского проекта.Проблемы с добавлением повторяющихся элементов по django_rest_framework ListSerializer
приложение PhoneGap будет укутаться несколько точек данных и толкает их к 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, чтобы просмотреть входящие данные и сравнить их с тем, что уже есть в базе данных, вычислив (незашифрованный) уникальный хэш на основе метки времени и идентификатора пользователя (кто загрузил это), а затем посмотреть, существует ли что-то с тем же хэшем. Этот подход был принят, поскольку фактические данные местоположения зашифрованы перед добавлением в базу данных.
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?
Мысли оценили!