2017-02-22 24 views
0

Я использую комбинацию приложения 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?

Мысли оценили!

ответ

0

Поскольку ваш json сам поврежден дубликатами. Я бы рекомендовал сначала очистить свой json после того, как вы получите его на бэкэнде (django). Вы можете попробовать подход, приведенный здесь: https://stackoverflow.com/a/33955470/4815238

Как только JSON будет чистым, создайте необходимые объекты. Надеюсь это поможет.