Fix country queryset

This commit is contained in:
littlewolf 2019-10-27 17:23:04 +03:00
parent 7eb241ffed
commit 0db2638eb8
3 changed files with 31 additions and 12 deletions

View File

@ -44,6 +44,7 @@ class Region(models.Model):
blank=True, default=None, on_delete=models.CASCADE) blank=True, default=None, on_delete=models.CASCADE)
country = models.ForeignKey( country = models.ForeignKey(
Country, verbose_name=_('country'), on_delete=models.CASCADE) Country, verbose_name=_('country'), on_delete=models.CASCADE)
old_id = models.IntegerField(null=True, blank=True, default=None)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -77,6 +78,7 @@ class City(models.Model):
_('postal code'), max_length=10, default='', help_text=_('Ex.: 350018')) _('postal code'), max_length=10, default='', help_text=_('Ex.: 350018'))
is_island = models.BooleanField(_('is island'), default=False) is_island = models.BooleanField(_('is island'), default=False)
old_id = models.IntegerField(null=True, blank=True, default=None)
objects = CityQuerySet.as_manager() objects = CityQuerySet.as_manager()

View File

@ -1,4 +1,4 @@
from django.db.models import Q, F from django.db.models import Q, QuerySet
from transfer.serializers.location import CountrySerializer, RegionSerializer, CitySerializer from transfer.serializers.location import CountrySerializer, RegionSerializer, CitySerializer
from transfer.models import Cities from transfer.models import Cities
@ -6,10 +6,18 @@ from pprint import pprint
def transfer_countries(): def transfer_countries():
queryset = Cities.objects.exclude(Q(country_code_2__isnull=True) | Q(country_code_2=""))\ # queryset = Cities.objects.exclude(Q(country_code_2__isnull=True) | Q(country_code_2="")) \
.values_list("country_code_2", flat=True).distinct() # .only("id", "country_code_2").annotate(Count("country_code_2")).order_by("country_code_2")
queryset = Cities.objects.raw("SELECT cities.id, cities.country_code_2 "
"FROM cities "
"WHERE NOT ((cities.country_code_2 IS NULL "
"OR (cities.country_code_2 = '' "
"AND cities.country_code_2 IS NOT NULL))) "
"GROUP BY cities.country_code_2")
serialized_data = CountrySerializer(data=list(queryset.values()), many=True) queryset = [vars(query) for query in queryset]
serialized_data = CountrySerializer(data=queryset, many=True)
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() serialized_data.save()
else: else:
@ -23,7 +31,7 @@ def transfer_regions():
Q(country_code_2__isnull=True) | Q(country_code_2__isnull=True) |
Q(region_code="") | Q(region_code="") |
Q(country_code_2="")).\ Q(country_code_2="")).\
values('region_code', 'country_code_2', 'subregion_code').distinct() values('id', 'region_code', 'country_code_2', 'subregion_code').distinct()
serialized_without_subregion = RegionSerializer(data=list(regions_without_subregion_queryset.values()), many=True) serialized_without_subregion = RegionSerializer(data=list(regions_without_subregion_queryset.values()), many=True)
if serialized_without_subregion.is_valid(): if serialized_without_subregion.is_valid():
@ -51,7 +59,7 @@ def transfer_cities():
queryset = Cities.objects.exclude(Q(region_code__isnull=True) | queryset = Cities.objects.exclude(Q(region_code__isnull=True) |
Q(country_code_2__isnull=True) | Q(country_code_2__isnull=True) |
Q(region_code="") | Q(region_code="") |
Q(country_code_2="")).only("name", "latitude", "longitude", "subregion_code", Q(country_code_2="")).only("id", "name", "latitude", "longitude", "subregion_code",
"country_code_2", "zip_code", "is_island") "country_code_2", "zip_code", "is_island")
serialized_data = CitySerializer(data=list(queryset.values()), many=True) serialized_data = CitySerializer(data=list(queryset.values()), many=True)
@ -63,10 +71,10 @@ def transfer_cities():
data_types = { data_types = {
"dictionaries": [ "dictionaries": [
transfer_regions,
], ],
"tmp": [ "tmp": [
transfer_countries, transfer_countries,
# transfer_regions,
# transfer_cities # transfer_cities
] ]
} }

View File

@ -25,7 +25,7 @@ class CountrySerializer(serializers.ModelSerializer):
# Some countries already in database # Some countries already in database
try: try:
country = Country.objects.get(code=validated_data['code']) country = Country.objects.get(code=validated_data['code'])
except Country.DoesNotExists: except Country.DoesNotExist:
country = Country.objects.create(**validated_data) country = Country.objects.create(**validated_data)
return country return country
@ -37,13 +37,15 @@ class RegionSerializer(serializers.ModelSerializer):
region_code = serializers.CharField() region_code = serializers.CharField()
subregion_code = serializers.CharField(allow_null=True) subregion_code = serializers.CharField(allow_null=True)
country_code_2 = serializers.CharField() country_code_2 = serializers.CharField()
id = serializers.IntegerField()
class Meta: class Meta:
model = Region model = Region
fields = ( fields = (
"region_code", "region_code",
"country_code_2", "country_code_2",
"subregion_code" "subregion_code",
"id"
) )
def validate(self, data): def validate(self, data):
@ -67,14 +69,16 @@ class RegionSerializer(serializers.ModelSerializer):
del (data['country_code_2']) del (data['country_code_2'])
del(data['subregion_code']) del(data['subregion_code'])
data['old_id'] = data.pop("id")
return data return data
def create(self, validated_data): def create(self, validated_data):
# Some regions may be already in database # Some regions may be already in database
try: try:
region, _ = Region.objects.get_or_create(**validated_data) region = Region.objects.get(old_id=validated_data['old_id'])
except Exception as e: except Region.DoesNotExist:
raise ValueError(f"{validated_data}: {e}") region = Region.objects.create(**validated_data)
return region return region
@ -84,6 +88,7 @@ class CitySerializer(serializers.ModelSerializer):
zip_code = serializers.CharField() zip_code = serializers.CharField()
is_island = serializers.IntegerField() is_island = serializers.IntegerField()
name = serializers.CharField() name = serializers.CharField()
id = serializers.IntegerField()
class Meta: class Meta:
model = City model = City
@ -93,6 +98,7 @@ class CitySerializer(serializers.ModelSerializer):
"zip_code", "zip_code",
"is_island", "is_island",
"name", "name",
"id"
) )
def validate(self, data): def validate(self, data):
@ -100,6 +106,7 @@ class CitySerializer(serializers.ModelSerializer):
data = self.set_code(data) data = self.set_code(data)
data = self.set_zip_code(data) data = self.set_zip_code(data)
data = self.set_relations(data) data = self.set_relations(data)
data = self.set_old_id(data)
return data return data
def create(self, validated_data): def create(self, validated_data):
@ -140,3 +147,5 @@ class CitySerializer(serializers.ModelSerializer):
data['postal_code'] = data.pop('zip_code') data['postal_code'] = data.pop('zip_code')
return data return data
def set_old_id(self, data):
data['old_id'] = data.pop('id')