Fix queryset conditions

This commit is contained in:
littlewolf 2019-10-28 00:15:37 +03:00
parent 0d30543664
commit 255b1ad5f1
3 changed files with 44 additions and 55 deletions

View File

@ -101,18 +101,10 @@ card = {
"dependencies": ("Country", "Region"), "dependencies": ("Country", "Region"),
"fields": { "fields": {
"Cities": { "Cities": {
"coordinates": (("lat", "latitude"), ("long", "longitude")), "name": "name",
"code": "country_code_2", "code": "country_code_2",
"postal_code": "zip_code", "postal_code": "zip_code",
"is_island": ("is_island", "is_island", "django.db.models.Boolean") "is_island": ("is_island", "is_island", "django.db.models.Boolean")
},
"relations": {
"CityNames": {
"key": "city",
"fields": {
"name": "name",
}
}
} }
}, },
"relations": { "relations": {

View File

@ -6,13 +6,10 @@ from pprint import pprint
def transfer_countries(): def transfer_countries():
# queryset = Cities.objects.exclude(Q(country_code_2__isnull=True) | Q(country_code_2="")) \
# .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 queryset = Cities.objects.raw("""SELECT cities.id, cities.country_code_2
FROM cities FROM cities WHERE
WHERE NOT ((cities.country_code_2 IS NULL country_code_2 IS NOT NULL AND
OR (cities.country_code_2 = '' country_code_2 != ""
AND cities.country_code_2 IS NOT NULL)))
GROUP BY cities.country_code_2""") GROUP BY cities.country_code_2""")
queryset = [vars(query) for query in queryset] queryset = [vars(query) for query in queryset]
@ -27,14 +24,13 @@ def transfer_countries():
def transfer_regions(): def transfer_regions():
regions_without_subregion_queryset = Cities.objects.raw("""SELECT cities.id, cities.region_code, regions_without_subregion_queryset = Cities.objects.raw("""SELECT cities.id, cities.region_code,
cities.country_code_2, cities.subregion_code cities.country_code_2, cities.subregion_code
FROM cities FROM cities WHERE
WHERE NOT ((cities.subregion_code IS NOT NULL (subregion_code IS NULL OR
OR cities.region_code IS NULL subregion_code = "") AND
OR cities.country_code_2 IS NULL region_code IS NOT NULL AND
OR (cities.region_code = '' region_code != "" AND
AND cities.region_code IS NOT NULL) country_code_2 IS NOT NULL AND
OR (cities.country_code_2 = '' country_code_2 != ""
AND cities.country_code_2 IS NOT NULL)))
GROUP BY region_code""") GROUP BY region_code""")
regions_without_subregion_queryset = [vars(query) for query in regions_without_subregion_queryset] regions_without_subregion_queryset = [vars(query) for query in regions_without_subregion_queryset]
@ -47,16 +43,22 @@ def transfer_regions():
regions_with_subregion_queryset = Cities.objects.raw("""SELECT cities.id, cities.region_code, regions_with_subregion_queryset = Cities.objects.raw("""SELECT cities.id, cities.region_code,
cities.country_code_2, cities.subregion_code cities.country_code_2, cities.subregion_code
FROM cities FROM cities WHERE
WHERE NOT ((cities.subregion_code IS NULL subregion_code IS NOT NULL AND
OR (cities.subregion_code = '' subregion_code != "" AND
OR cities.region_code IS NULL region_code IS NOT NULL AND
OR cities.country_code_2 IS NULL region_code != "" AND
OR (cities.region_code = '' country_code_2 IS NOT NULL AND
AND cities.region_code IS NOT NULL) country_code_2 != ""
OR (cities.country_code_2 = '' AND cities.subregion_code in (
AND cities.country_code_2 IS NOT NULL)))) SELECT region_code FROM cities WHERE
AND cities.subregion_code in (SELECT region_code FROM cities) (subregion_code IS NULL OR
subregion_code = "") AND
region_code IS NOT NULL AND
region_code != "" AND
country_code_2 IS NOT NULL AND
country_code_2 != ""
)
GROUP BY region_code""") GROUP BY region_code""")
regions_with_subregion_queryset = [vars(query) for query in regions_with_subregion_queryset] regions_with_subregion_queryset = [vars(query) for query in regions_with_subregion_queryset]
@ -72,12 +74,13 @@ 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("id", "name", "latitude", "longitude", "subregion_code", Q(country_code_2="")).only("id", "name", "region_code",
"country_code_2", "zip_code", "is_island") "country_code_2", "zip_code", "is_island").distinct()
serialized_data = CitySerializer(data=list(queryset.values()), many=True) serialized_data = CitySerializer(data=list(queryset.values()), many=True)
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() # serialized_data.save()
print(serialized_data.validated_data)
else: else:
pprint(f"City serializer errors: {serialized_data.errors}") pprint(f"City serializer errors: {serialized_data.errors}")

View File

@ -35,7 +35,7 @@ class CountrySerializer(serializers.ModelSerializer):
class RegionSerializer(serializers.ModelSerializer): 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, allow_blank=True)
country_code_2 = serializers.CharField() country_code_2 = serializers.CharField()
id = serializers.IntegerField() id = serializers.IntegerField()
@ -52,7 +52,6 @@ class RegionSerializer(serializers.ModelSerializer):
data = self.set_old_id(data) data = self.set_old_id(data)
data = self.set_code(data) data = self.set_code(data)
data = self.set_country(data) data = self.set_country(data)
return data return data
def create(self, validated_data): def create(self, validated_data):
@ -66,7 +65,8 @@ class RegionSerializer(serializers.ModelSerializer):
return region return region
def set_code(self, data): def set_code(self, data):
if "subregion_code" in data and data["subregion_code"] is not None: print(data)
if "subregion_code" in data and data["subregion_code"] is not None and data["subregion_code"].strip() != "":
try: try:
parent_region = Region.objects.get(code=str(data['region_code'])) parent_region = Region.objects.get(code=str(data['region_code']))
except Exception as e: except Exception as e:
@ -75,7 +75,6 @@ class RegionSerializer(serializers.ModelSerializer):
data['parent_region'] = parent_region data['parent_region'] = parent_region
data['code'] = data.pop('subregion_code') data['code'] = data.pop('subregion_code')
del(data['region_code']) del(data['region_code'])
else: else:
data['code'] = data.pop('region_code') data['code'] = data.pop('region_code')
del(data['subregion_code']) del(data['subregion_code'])
@ -100,7 +99,6 @@ class RegionSerializer(serializers.ModelSerializer):
class CitySerializer(serializers.ModelSerializer): class CitySerializer(serializers.ModelSerializer):
country_code_2 = serializers.CharField() country_code_2 = serializers.CharField()
subregion_code = serializers.CharField()
zip_code = serializers.CharField() zip_code = serializers.CharField()
is_island = serializers.IntegerField() is_island = serializers.IntegerField()
name = serializers.CharField() name = serializers.CharField()
@ -110,7 +108,6 @@ class CitySerializer(serializers.ModelSerializer):
model = City model = City
fields = ( fields = (
"country_code_2", "country_code_2",
"subregion_code",
"zip_code", "zip_code",
"is_island", "is_island",
"name", "name",
@ -118,11 +115,11 @@ class CitySerializer(serializers.ModelSerializer):
) )
def validate(self, data): def validate(self, data):
data = self.set_old_id(data)
data = self.set_relations(data)
data = self.set_is_island(data) data = self.set_is_island(data)
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_old_id(data)
return data return data
def create(self, validated_data): def create(self, validated_data):
@ -141,18 +138,14 @@ class CitySerializer(serializers.ModelSerializer):
def set_relations(self, data): def set_relations(self, data):
try: try:
region = Region.objects.get(code=data['code']) region = Region.objects.get(old_id=data['old_id'])
except: except Region.DoesNotExist as e:
try:
region = Region.objects.get(code=data['subregion_code'])
except Exception as e:
raise ValueError(f"Region not found with {data}: {e}") raise ValueError(f"Region not found with {data}: {e}")
data['region'] = region data['region'] = region
del(data['subregion_code'])
try: try:
country = Country.objects.get(code=data['code']) country = Country.objects.get(old_id=data['old_id'])
except Exception as e: except Country.DoesNotExist as e:
raise ValueError(f"Region not found with {data}: {e}") raise ValueError(f"Region not found with {data}: {e}")
data['country'] = country data['country'] = country
@ -165,3 +158,4 @@ class CitySerializer(serializers.ModelSerializer):
def set_old_id(self, data): def set_old_id(self, data):
data['old_id'] = data.pop('id') data['old_id'] = data.pop('id')
return data