- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 django 的新手,正在使用 django-rest-framework
构建 REST API。我已经编写了一些代码来检查用户是否提供了一些参数。但是对于很多 if 条件
来说这非常难看,所以我想重构它。下面是我编写的代码请建议如何重构它。
我正在寻找一些基于 Django 的验证。
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.append(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)
Assets 模型
class Assets(models.Model):
assetid = models.CharField(db_column='AssetID', primary_key=True, max_length=255) # Field name made lowercase.
assetname = models.CharField(db_column='AssetName', max_length=255, blank=True, null=True) # Field name made lowercase.
locationid = models.ForeignKey('Locations', models.DO_NOTHING, db_column='LocationID') # Field name made lowercase.
assetuniversalid = models.CharField(db_column='AssetBluenumber', unique=True, blank=True, null=True, max_length=255) # Field name made lowercase.
assettype = models.CharField(db_column='AssetType', max_length=45, blank=True, null=True) # Field name made lowercase.
assetinserted = models.DateTimeField(db_column='AssetInserted', blank=True, null=True, auto_now_add=True) # Field name made lowercase.
assetupdated = models.DateTimeField(db_column='AssetUpdated', blank=True, null=True, auto_now=True) # Field name made lowercase.
最佳答案
你可以制作serializers ,他们有一种非常简单的方法来验证您的数据。在您的情况下,所有字段似乎都是必需的,它变得更加容易。
在您的 api 应用程序上创建一个文件,例如:
#Import Serializers lib
from rest_framework import serializers
#Import your models here (You can put more than one serializer in one file)
from assets.model import Assets
#Now make you serializer class
class AssetsSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = '__all__'
#This last line will put all the fields on you serializer
#but you can also especify only some fields like:
#fields = ('assetid', 'assetname')
在您的 View 中,您可以使用您的序列化程序类来验证您的数据。
#Serializers
from assets.serializers import AssetsSerializer
#Libraries you can use
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class AssetsViewSet(viewsets.ModelViewSet):
queryset = Assets.objects.using("gpr").all()
def create(self, request):
assets = []
farming_details = {}
#Set your serializer
serializer = AssetsSerializer(data=request.data)
if serializer.is_valid(): #MAGIC HAPPENS HERE
#... Here you do the routine you do when the data is valid
#You can use the serializer as an object of you Assets Model
#Save it
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我从文档中获取了这一切。您可以通过 tutorial 学到很多东西从官方网站。希望对您有所帮助。
关于python - 在 viewsets.ModelViewSet 上获取参数验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36897802/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!