From 0d3916948ec5c0bb38d0f5e44d0f43fa92fd8fad Mon Sep 17 00:00:00 2001 From: AlexP077 Date: Tue, 3 Oct 2023 20:21:02 +0300 Subject: [PATCH] fix_get_or_create --- service/service.py | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/service/service.py b/service/service.py index 9d8a511..2dd18a7 100644 --- a/service/service.py +++ b/service/service.py @@ -40,13 +40,13 @@ class PointService: req_url = f"https://geocode.search.hereapi.com/v1/geocode?q={addr}&apiKey={GEOCODER_API_KEY}" response = requests.get(req_url).json().get('items') if not response: - models.PrePlacementPoint.objects.create(address=addr, matching_status=MatchingStatus.Error.name, + models.PrePlacementPoint.objects.get_or_create(address=addr, matching_status=MatchingStatus.Error.name, status=PointStatus.Pending.name) problem += 1 continue coords = response[0].get('position') if not coords: - models.PrePlacementPoint.objects.create(address=addr, matching_status=MatchingStatus.Error.name, + models.PrePlacementPoint.objects.get_or_create(address=addr, matching_status=MatchingStatus.Error.name, status=PointStatus.Pending.name) problem += 1 continue @@ -64,8 +64,19 @@ class PointService: for o in objs: distances = models.PlacementPointPVZDistance.objects.filter(placement_point=o.get('id')).all() o.pop('id') - pre_obj, _ = models.PrePlacementPoint.objects.get_or_create( - **{**o, "matching_status": MatchingStatus.Matched.name}) + street = o.pop('street') + house_number = o.pop('house_number') + if o.get('name'): + name = o.pop('name') + pre_obj, _ = models.PrePlacementPoint.objects.get_or_create(street=street, + house_number=house_number,name=name, + matching_status=MatchingStatus.Matched.name, + defaults=o) + else: + pre_obj, _ = models.PrePlacementPoint.objects.get_or_create(street=street, + house_number=house_number, + matching_status=MatchingStatus.Matched.name, + defaults=o) for d in distances: models.PrePlacementPointPVZDistance.objects.get_or_create(placement_point=pre_obj, pvz_postamates_group=d.pvz_postamates_group, @@ -73,8 +84,9 @@ class PointService: matched += 1 elif not rayon: - models.PrePlacementPoint.objects.get_or_create(address=addr, street=response.get('street'), + models.PrePlacementPoint.objects.get_or_create(street=response.get('street'), house_number=response.get('houseNumber'), + address=addr, subject_rf=response.get('state'), city=response.get('city'), category=cat, geometry=wkt, sample_trn=False, @@ -83,27 +95,28 @@ class PointService: status=PointStatus.Pending.name) problem += 1 elif cat == 'Подъезд жилого дома' and models.House.objects.filter(street=response.get('street'), - house_number=response.get('houseNumber')).first(): + house_number=response.get( + 'houseNumber')).first(): house = models.House.objects.filter(street=response.get('street'), - house_number=response.get('houseNumber')).values().first() + house_number=response.get('houseNumber')).values().first() house.pop('id') if house.get('doors') and house.get('doors') > 1: house['flat_cnt'] = int(house['flat_cnt'] / house['doors']) for _num in range(house['doors']): - models.PrePlacementPoint.objects.get_or_create(**house, address=addr, + models.PrePlacementPoint.objects.get_or_create(address=addr, name=f'Подъезд {_num + 1}', matching_status=MatchingStatus.New.name, sample_trn=False, - is_vis=True,category=cat, geometry=wkt, + is_vis=True, category=cat, geometry=wkt, status=PointStatus.Pending.name, area=rayon, - district=rayon.AO) + district=rayon.AO, defaults=house) else: - models.PrePlacementPoint.objects.get_or_create(**house, address=addr, + models.PrePlacementPoint.objects.get_or_create(address=addr, matching_status=MatchingStatus.New.name, sample_trn=False, - is_vis=True,category=cat, geometry=wkt, + is_vis=True, category=cat, geometry=wkt, status=PointStatus.Pending.name, area=rayon, - district=rayon.AO) + district=rayon.AO, defaults=house) else: models.PrePlacementPoint.objects.get_or_create(address=addr, street=response.get('street'), house_number=response.get('houseNumber'),