回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我不熟悉django,并使用<code>django-rest-framework</code>构建restapi。
我写了一些代码来检查用户是否提供了一些参数或不是。但是这对于很多<code>if conditions</code>是非常难看的,所以我想重构它。下面是我写的代码,请建议如何重构它。在</p>
<p>我正在寻找一些基于django的验证。在</p>
<pre><code>class AssetsViewSet(viewsets.ModelViewSet):
queryset = Assets.objects.using("gpr").all()
def create(self, request):
assets = []
farming_details = {}
bluenumberid = request.data.get('bluenumberid', None)
if not bluenumberid:
return Response({'error': 'BlueNumber is required.'})
actorid = request.data.get('actorid', None)
if not actorid:
return Response({'error': 'Actorid is required.'})
asset_details = request.data.get('asset_details', None)
if not asset_details:
return Response({'error': 'AssetDetails is required.'})
for asset_detail in asset_details:
location = asset_detail.get('location', None)
if not location:
return Response({'error': 'location details is required.'})
assettype = asset_detail.get('type', None)
if not assettype:
return Response({'error': 'assettype is required.'})
asset_relationship = asset_detail.get('asset_relationship', None)
if not asset_relationship:
return Response({'error': 'asset_relationship is required.'})
subdivision_code = location.get('subdivision_code', None)
if not subdivision_code:
return Response({'error': 'subdivision_code is required.'})
country_code = location.get('country_code', None)
if not country_code:
return Response({'error': 'country_code is required.'})
locationtype = location.get('locationtype', None)
if not locationtype:
return Response({'error': 'locationtype is required.'})
latitude = location.get('latitude', None)
if not latitude:
return Response({'error': 'latitude is required.'})
longitude = location.get('longitude', None)
if not longitude:
return Response({'error': 'longitude is required.'})
try:
country_instance = Countries.objects.using('gpr').get(countrycode=country_code)
except:
return Response({'error': 'Unable to find country with countrycode ' + str(country_code)})
try:
subdivision_instance = NationalSubdivisions.objects.using('gpr').get(subdivisioncode=subdivision_code, countrycode=country_code)
except:
return Response({'error': 'Unable to find subdivision with countrycode ' + str(country_code) + ' and' + ' subdivisioncode ' + str(subdivision_code)})
kwargs = {}
kwargs['pobox'] = location.get('pobox', '')
kwargs['sublocation'] = location.get('sublocation', '')
kwargs['streetaddressone'] = location.get('streetaddressone', '')
kwargs['streetaddresstwo'] = location.get('streetaddresstwo', '')
kwargs['streetaddressthree'] = location.get('streetaddressthree', '')
kwargs['city'] = location.get('city', '')
kwargs['postalcode'] = location.get('postalcode', '')
cursor = connections['gpr'].cursor()
cursor.execute("Select uuid() as uuid")
u = cursor.fetchall()
uuid = u[0][0].replace("-", "")
kwargs['locationid'] = uuid
# l.refresh_from_db()
try:
Locations.objects.using('gpr').create_location(locationtype=locationtype, latitude=latitude, longitude=longitude, countrycode=country_instance, subdivisioncode = subdivision_instance, **kwargs)
except (TypeError, ValueError):
return Response({'error': 'Error while saving location'})
try:
location_entry = Locations.objects.using('gpr').get(locationid=uuid)
except:
return Response({'error': 'Unable to find location with locationid ' + str(uuid)})
asset_entry = Assets.objects.using('gpr').create(locationid=location_entry, assettype=assettype)
asset_entry = Assets.objects.using('gpr').filter(locationid=location_entry, assettype=assettype).latest('assetinserted')
farming_details[asset_entry.assetid] = []
try:
actor = Actors.objects.using('gpr').get(actorid = actorid)
except:
return Response({'error': 'Unable to find actor with actorid ' + str(actorid)})
assetrelationship = AssetRelationships.objects.using('gpr').create(assetid= asset_entry, actorid= actor,assetrelationship=asset_relationship)
assets.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(asset_entry)
if assettype=="Farm or pasture land":
hectares = asset_detail.get('hectares', None)
if hectares is None:
return Response({'error': 'hectares must be a decimal number'})
try:
farmingasset = FarmingAssets.objects.using('gpr').create(assetid=asset_entry, hectares=hectares)
except ValidationError:
return Response({'error': 'hectares must be decimal value.'})
farmingasset = FarmingAssets.objects.using('gpr').filter(assetid=asset_entry, hectares=hectares).last()
for type_detail in asset_detail.get('type_details', []):
crop = type_detail.get('crop', '')
hectare = type_detail.get('hectare', '')
if crop != '' and hectare != '':
try:
h3code = ProductCodes.objects.using('gpr').get(h3code=crop)
except:
return Response({'error': 'Unable to find ProductCode with h3code' + str(crop)})
try:
farming = Farming.objects.using('gpr').create(assetid=farmingasset, h3code=h3code, annualyield=hectare)
farming_details[asset_entry.assetid].append(farming.farmingid)
except Exception as e:
return Response({'error': e})
else:
return Response({'error': 'crop with hectare is required.'})
i = 0
data = {}
for asset in assets:
if farming_details[asset.assetid]:
data[i] = {"assetid": asset.assetid, "assetbluenumber": asset.assetuniversalid, "farming_ids": farming_details[asset.assetid]}
else:
data[i] = {"assetid": asset.assetid, "assetbluenumber": asset.assetuniversalid}
i+=1
return Response(data)
</code></pre>
<p>资产模型</p>
^{pr2}$