為什么網(wǎng)站建設(shè)需要每年續(xù)費重慶公司建設(shè)網(wǎng)站
鶴壁市浩天電氣有限公司
2026/01/24 14:22:53
為什么網(wǎng)站建設(shè)需要每年續(xù)費,重慶公司建設(shè)網(wǎng)站,微信小程序商城制作,楚雄網(wǎng)站建設(shè)rewlkj數(shù)據(jù)集渲染任務(wù)管理——后端搭建引言一、主要功能二、實現(xiàn)步驟2.1 創(chuàng)建App#xff08;1#xff09;使用命令行創(chuàng)建App#xff08;2#xff09;注冊App#xff08;3#xff09;配置路由2.2 創(chuàng)建Model#xff08;1#xff09;配置媒體文件地址#xff08;2#xff09;創(chuàng)…數(shù)據(jù)集渲染任務(wù)管理——后端搭建引言一、主要功能二、實現(xiàn)步驟2.1 創(chuàng)建App1使用命令行創(chuàng)建App2注冊App3配置路由2.2 創(chuàng)建Model1配置媒體文件地址2創(chuàng)建model3遷移數(shù)據(jù)庫2.3 在Admin中注冊模型2.4 效果引言計算機專業(yè)碩士在讀主要研究方向是特定目標大斜視角目標檢測與定位。因為要做的是特定目標公開數(shù)據(jù)集較少經(jīng)過多方考慮還是決定要自建數(shù)據(jù)集。最終考慮的解決方案還是BlenderPython API的方式項目起名叫RealEarthStudio。這系列文章主要對開發(fā)過程進行記錄方便我個人后續(xù)查看也給相類似方向的同學提供一個思路?!卷椖磕夸洝宽椖磕夸涙溄右?、主要功能功能數(shù)據(jù)集渲染任務(wù)管理——后端搭建。背景現(xiàn)在開始開發(fā)第二個應(yīng)用主要實現(xiàn)數(shù)據(jù)集渲染任務(wù)管理。效果碼云項目鏈接https://gitee.com/charlsewyq/RealEarthStudio二、實現(xiàn)步驟2.1 創(chuàng)建App1使用命令行創(chuàng)建Apppython manage.py startapp app2_rendering_task2注冊App在App目錄下編輯apps文件app2_rendering_task/apps.pyfromdjango.appsimportAppConfigclassApp2RenderingTaskConfig(AppConfig):default_auto_fielddjango.db.models.BigAutoFieldnameapp2_rendering_taskverbose_name? 應(yīng)用2數(shù)據(jù)集渲染任務(wù)管理模塊在主項目目錄的settings.py中添加appINSTALLED_APPS[...,# 我的應(yīng)用app2_rendering_task.apps.App2RenderingTaskConfig,]3配置路由在App目錄下創(chuàng)建urls.pyfromdjango.urlsimportpathfrom.importviews app_nameapp2_rendering_taskurlpatterns[# 子路由]在主項目目錄的urls.py修改fromdjango.contribimportadminfromdjango.urlsimportpath,include urlpatterns[...# app2: 數(shù)據(jù)集渲染任務(wù)管理模塊path(api/app2/,include(app2_rendering_task.urls)),]2.2 創(chuàng)建Model我想創(chuàng)建渲染任務(wù)Model包含以下字段渲染ID字符串類型模型的唯一標識自動生成渲染時間時間類型上傳模型的時間根據(jù)后臺時間自動記錄目標模型多對多對應(yīng)目標模型Modelapp1_model_management.TargetModel場景模型多對多對應(yīng)場景模型Modelapp1_model_management.SceneModel日光方位角浮點類型陽光照射的方位角限制為0-360°默認為0°日光高低角浮點類型陽光照射的高低角限制為0-90°默認為90°相機距離JSON類型相機距離目標模型的距離數(shù)組限制為正值相機高低角JSON類型相機照射的高低角數(shù)組限制為0-90°相機方位角間隔浮點類型陽光照射的方位角限制為0-360°默認為45°渲染圖像分辨率寬整型渲染圖像的寬。渲染圖像分辨率高整型渲染圖像的寬。渲染圖像像素計算屬性渲染圖像的像素值。模型器類別字符串類型渲染器類別EEVEE或CYCLES渲染圖像地址文件地址類型只讀用于存儲渲染結(jié)果刪除數(shù)據(jù)時自動刪除對應(yīng)文件夾中的文件1配置媒體文件地址在主項目目錄創(chuàng)建文件夾media在settings.py中添加以下內(nèi)容MEDIA_URL/media/MEDIA_ROOTos.path.join(BASE_DIR,media)配置媒體文件服務(wù)在主項目目錄下編輯urls.py文件...# 只在DEBUG模式下提供媒體文件服務(wù)ifsettings.DEBUG:urlpatternsstatic(settings.MEDIA_URL,document_rootsettings.MEDIA_ROOT)2創(chuàng)建model還需要完成以下功能自動生成UUID確保模型ID不重復(fù)自動記錄時間把目標模型和刪除數(shù)據(jù)時同步刪除模型文件修改文件數(shù)據(jù)時替換模型文件在App目錄下編輯model文件app2_rendering_task/models.pyimportosimportuuidfromdjango.dbimportmodelsfromdjango.utilsimporttimezonefromdjango.core.exceptionsimportValidationErrorimportshutilfromapp1_model_management.modelsimportTargetModel,SceneModel# 驗證器 defvalidate_azimuth(value):ifnot(0value360):raiseValidationError(方位角必須在 0° 到 360° 之間。)defvalidate_elevation(value):ifnot(0value90):raiseValidationError(高低角必須在 0° 到 90° 之間。)defvalidate_positive_number_list(value):驗證是否為正數(shù)列表ifnotisinstance(value,list):raiseValidationError(必須是一個列表。)foriteminvalue:ifnotisinstance(item,(int,float))oritem0:raiseValidationError(所有值必須是正數(shù)。)defvalidate_elevation_list(value):驗證高低角列表 0-90ifnotisinstance(value,list):raiseValidationError(必須是一個列表。)foriteminvalue:ifnotisinstance(item,(int,float))ornot(0item90):raiseValidationError(所有高低角必須在 0° 到 90° 之間。)# 模型 defrendered_result_path(instance,filename):場景模型上傳路徑returnos.path.join(Render,f{instance.render_time}-{instance.render_id})classRenderingTask(models.Model):RENDERER_CHOICES[(EEVEE,EEVEE),(CYCLES,Cycles),]# 任務(wù)信息render_idmodels.UUIDField(渲染ID,defaultuuid.uuid4,editableFalse,uniqueTrue,help_text渲染任務(wù)的唯一標識)render_timemodels.DateTimeField(verbose_name渲染時間,defaulttimezone.now)# 模型target_modelsmodels.ManyToManyField(TargetModel,verbose_name目標模型,blankTrue,related_namerendering_tasks)scene_modelsmodels.ManyToManyField(SceneModel,verbose_name場景模型,blankTrue,related_namerendering_tasks)# 日光參數(shù)sun_azimuthmodels.FloatField(日光方位角,default0.0,validators[validate_azimuth],help_text陽光照射的方位角0°-360°)sun_elevationmodels.FloatField(日光高低角,default90.0,validators[validate_elevation],help_text陽光照射的高低角0°-90°)# 相機參數(shù)camera_distancesmodels.JSONField(相機距離,defaultlist,blankTrue,validators[validate_positive_number_list],help_text相機到目標的距離列表正值)camera_elevationsmodels.JSONField(相機高低角,defaultlist,blankTrue,validators[validate_elevation_list],help_text相機高低角列表0°-90°)camera_rotation_stepmodels.FloatField(相機方位角間隔,default45.0,validators[validate_azimuth],help_text相機方位角采樣間隔0°-360°)# 渲染分辨率image_widthmodels.PositiveIntegerField(渲染圖像分辨率寬,default1920)image_heightmodels.PositiveIntegerField(渲染圖像分辨率高,default1080)# 渲染器類別renderer_typemodels.CharField(渲染器類別,max_length10,choicesRENDERER_CHOICES,defaultEEVEE)# 渲染結(jié)果文件rendered_resultmodels.FileField(渲染圖像地址,upload_torendered_result_path,blankTrue,nullTrue,help_text系統(tǒng)自動生成的渲染結(jié)果圖像只讀)classMeta:verbose_name01-渲染任務(wù)verbose_name_plural01-渲染任務(wù)ordering[-render_time]def__str__(self):returnf{self.render_id}propertydefimage_pixels(self):計算屬性總像素數(shù)returnself.image_width*self.image_heightdefsave(self,*args,**kwargs):可選在保存前調(diào)用 full_clean() 進行驗證self.full_clean()super().save(*args,**kwargs)defdelete(self,*args,**kwargs): 重寫 delete 方法 1. 先刪除關(guān)聯(lián)的渲染輸出文件夾 2. 再調(diào)用父類 delete 刪除數(shù)據(jù)庫記錄 ifself.rendered_result:# 獲取文件的絕對路徑folder_dirself.rendered_result.path# 如果文件存在則刪除ifos.path.isdir(folder_dir):shutil.rmtree(folder_dir)# 調(diào)用父類的delete方法刪除數(shù)據(jù)庫記錄super().delete(*args,**kwargs)3遷移數(shù)據(jù)庫# 生成遷移文件python manage.py makemigrations app2_rendering_task# 應(yīng)用遷移python manage.py migrate app2_rendering_task2.3 在Admin中注冊模型在App目錄下編輯admin文件app2_rendering_task/admin.pyfromdjango.contribimportadminfrom.modelsimport*fromdjango.utils.safestringimportmark_safeadmin.register(RenderingTask)classRenderingTaskAdmin(admin.ModelAdmin):list_display[render_id,render_time,renderer_type,image_width,image_height,render_progress_display]search_fields[render_id]list_filter[renderer_type,render_time]readonly_fields[render_id,render_time,render_progress,rendered_result]# 字段分組顯示fieldsets((任務(wù)信息,{fields:(render_id,render_time,renderer_type,render_progress)}),(模型配置,{fields:(target_models,scene_models)}),(光照參數(shù),{fields:(sun_azimuth,sun_elevation)}),(相機參數(shù),{fields:(camera_distances,camera_elevations,camera_rotation_step)}),(圖像設(shè)置,{fields:(image_width,image_height)}),(渲染結(jié)果,{fields:(rendered_result,)}))admin.display(description渲染狀態(tài))defrender_progress_display(self,obj):ifobj.render_progress0:# 如果狀態(tài)是pending顯示一個鏈接returnmark_safe(fa href#開始渲染/a)else:# 否則顯示當前狀態(tài)returnf{obj.render_progress}%2.4 效果