from pprint import pprint from django.db.models import Aggregate, CharField, Value from django.db.models import IntegerField, F from news.models import NewsType from tag.models import TagCategory from transfer.models import PageTexts from transfer.serializers.news import NewsSerializer class GroupConcat(Aggregate): function = 'GROUP_CONCAT' template = '%(function)s(%(expressions)s)' def __init__(self, expression, **extra): output_field = extra.pop('output_field', CharField()) super().__init__(expression, output_field=output_field, **extra) def as_postgresql(self, compiler, connection): self.function = 'STRING_AGG' return super().as_sql(compiler, connection) def transfer_news(): news_type, _ = NewsType.objects.get_or_create(name='News') tag_cat_tag, _ = TagCategory.objects.get_or_create(index_name='tag') tag_cat_category, _ = TagCategory.objects.get_or_create(index_name='category') news_type.tag_categories.add(tag_cat_tag) news_type.tag_categories.add(tag_cat_category) news_type.save() queryset = PageTexts.objects.filter( page__type='News', ).annotate( page__id=F('page__id'), news_type_id=Value(news_type.id, output_field=IntegerField()), page__created_at=F('page__created_at'), page__account_id=F('page__account_id'), page__state=F('page__state'), page__template=F('page__template'), page__site__country_code_2=F('page__site__country_code_2'), page__root_title=F('page__root_title'), page__attachment_suffix_url=F('page__attachment_suffix_url'), page__published_at=F('page__published_at'), tags=GroupConcat('page__tags__id'), tag_cat_tag_id=Value(tag_cat_tag.id, output_field=IntegerField()), tag_cat_category_id=Value(tag_cat_category.id, output_field=IntegerField()), ) serialized_data = NewsSerializer(data=list(queryset.values()), many=True) if serialized_data.is_valid(): serialized_data.save() else: pprint(f'News serializer errors: {serialized_data.errors}') data_types = { 'news': [transfer_news] }