2016-09-26 69 views
0

通过在Django模型字段。这是我的模型类更新设置request.POST

class SubJobs(models.Model): 
    id = models.AutoField(primary_key = True) 
    subjob_name = models.CharField(max_length=32,help_text="Enter subjob name") 
    subjobtype = models.ForeignKey(SubjobType) 
    jobstatus = models.ForeignKey(JobStatus, default= None, null=True) 
    rerun = models.ForeignKey(ReRun,help_text="Rerun") 
    transfer_method = models.ForeignKey(TransferMethod,help_text="Select transfer method") 
    priority = models.ForeignKey(Priority,help_text="Select priority") 
    suitefiles = models.ForeignKey(SuiteFiles,help_text="Suite file",default=None,null=True) 
    topofiles = models.ForeignKey(TopoFiles,help_text="Topo file",default=None,null=True) 
    load_image = models.NullBooleanField(default = True,help_text="Load image") 
    description = models.TextField(help_text="Enter description",null=True)       command = models.TextField(help_text="Command",null=True) 
    run_id = models.IntegerField(help_text="run_id",null=True) 
    pid_of_run = models.IntegerField(help_text="pid_of_run",null=True) 
    hold_time = models.IntegerField() 
    created = models.DateTimeField(default=timezone.now,null=True) 
    updated = models.DateTimeField(default=timezone.now,null=True) 
    finished = models.DateTimeField(null=True) 

用户可能要更新一个条目,可以选择更新其中只有少数领域。如何编写只更新已传递字段的通用更新语句?

我试过了。

def update_subjob(request): 
if (request.method == 'POST'): 
    subjobs_subjobid = request.POST[('subjob_id')] 
    post_data = request.POST 
    if 'subjob_name' in post_data: 
     subjobs_subjobname = request.POST[('subjob_name')] 
    if 'subjob_type' in post_data: 
     subjobs_subjobtype = request.POST[('subjob_type')] 
    if 'rerun_id' in post_data: 
     subjobs_rerun_id = request.POST[('rerun_id')] 
    if 'priority_id' in post_data: 
     subjobs_priority_id = request.POST[('priority_id')] 
    if 'transfer_method' in post_data: 
     subjobs_transfermethod = request.POST[('transfer_method')] 
    if 'suitefile' in post_data: 
     subjob_suitefile = request.POST[('suitefile')] 
    if 'topofile' in post_data: 
     subjob_topofile = request.POST[('topofile')] 
    try: 
     subjobinstance = SubJobs.objects.filter(id=subjobs_subjobid).update(subjob_name=subjobs_subjobname, 
           updated=datetime.now()) 

    except Exception as e: 
     print("PROBLEM UPDAING SubJob!!!!") 
     print(e.message) 

我如何写一个通用的更新只更新那些在request.POST发领域?

+0

这不正是这种形式? –

回答

1

你最好使用Forms。但是如果你坚持你的代码,可以这样做。

假设您有变量field_to_update其中列出您在请求中等待的每个字段。

subjobs_subjobid = request.POST[('subjob_id')] 

field_to_update = ('subjob_name','subjob_type', 'rerun_id', 'priority_id', 'transfer_method', 'suitefile', 'topofile') 
post_data = request.POST 
to_be_updated = {field: post_data.get(field) for field in field_to_update if field in post_data} 
# then you need to get the object, not filter it 
try: 
    subjobinstance = SubJobs.objects.get(id=subjobs_subjobid) 
    subjobinstance.update(**to_be_updated, updated=datetime.now()) 
except ObjectDoesNotExist: # from django.core.exceptions 
    print('There is no such object') # better to use logger 
except Exception as e: 
    print("PROBLEM UPDAING SubJob!!!!") 
    print(e.message) 
+0

完美!这是我需要的。 – theblackpearl