def handle(self, *args, **options): """ Основной метод - точка входа """ items = Item.objects.all() save_pickle_file('./pk_list.pickle', list(items.values_list('pk', flat=True))) items.update(to_update=True)
def update_news(): items_on_once = 10 filepath = './pk_list.pickle' # если какая-то новость косячная, то на ней обработка не замнется pk_list = load_pickle_file(filepath) shuffle(pk_list) if pk_list is None: return list_tags = list(Tag.objects.values_list('name', flat=True)) while pk_list: print('Parse: (left - %s)' % len(pk_list)) success_pks = [] for item in Item.objects.filter(pk__in=pk_list[:items_on_once]): try: http_code, content, _ = _get_http_data_of_url(item.link) assert http_code == '404', 'Not found page' item_data = { 'title': item.title, 'content': content, 'description': item.description, } tags_for_item = _get_tags_for_item(item_data, list_tags) if tags_for_item: # todo # надо ли определяет каких тегов нет еще и добавлять только их # или писать все, а БД сама разберется? # разница - в количестве запросов tags_for_insert = diff(tags_for_item, item.tags.values_list('name', flat=True)) tags_objects = Tag.objects.filter(name__in=tags_for_insert) item.tags.add(*tags_objects) item.save() except Exception: pass # print(item) success_pks.append(item.pk) Item.objects.filter(pk__in=success_pks).update(to_update=False) pk_list = diff(pk_list, success_pks) save_pickle_file(filepath, pk_list)
def update_news(): items_on_once = 10 filepath = './pk_list.pickle' # если какая-то новость косячная, то на ней обработка не замнется pk_list = load_pickle_file(filepath) shuffle(pk_list) if pk_list is None: return list_tags = list(Tag.objects.values_list('name', flat=True)) while pk_list: print("Parse: (left - %s)" % len(pk_list)) success_pks = [] for item in Item.objects.filter(pk__in=pk_list[:items_on_once]): try: http_code, content = _get_http_data_of_url(item.link) assert http_code == '404', "Not found page" item_data = { 'title': item.title, 'content': content, 'description': item.description, } tags_for_item = _get_tags_for_item(item_data, list_tags) if tags_for_item: # todo # надо ли определяет каких тегов нет еще и добавлять только их # или писать все, а БД сама разберется? # разница - в количестве запросов tags_for_insert = diff(tags_for_item, item.tags.values_list('name', flat=True)) tags_objects = Tag.objects.filter(name__in=tags_for_insert) item.tags.add(*tags_objects) item.save() except Exception: pass print(item) success_pks.append(item.pk) Item.objects.filter(pk__in=success_pks).update(to_update=False) pk_list = diff(pk_list, success_pks) save_pickle_file(filepath, pk_list)