2016-04-15 122 views
0

models.pyDjango的ORM:如何更新一到一個關係字段值

class Area(models.Model): 
    area_name = models.CharField(max_length=255, null=False, blank=False) 
    description = models.TextField(null=False, blank=False) 

class AreaPoint(models.Model): 
    x_axis = models.FloatField(default=0.0) 
    y_axis = models.FloatField(default=0.0) 
    area = models.OneToOneField(Area,primary_key=True,on_delete=models.CASCADE) 

我要做兩種方法,但都失敗了,請指導我。謝謝

# first method : 
# Area.objects.filter(id=304).update(area_name="today is 1", description="today is 1", areapoint__x_axis=111,areapoint__y_axis=222) 
# error : Area has no field named 'areapoint__y_axis' 

# second method : 
obj = Area.objects.get(id=304) 
print obj.areapoint.x_axis # 277 
print obj.areapoint.y_axis # 65 
obj.areapoint.x_axis = 100 
obj.areapoint.y_axis = 200 
print obj.areapoint.x_axis # 100 
print obj.areapoint.y_axis # 200 
obj.save() 
print obj.areapoint.x_axis # 100 
print obj.areapoint.y_axis # 200 

第二種方法很奇怪。更新後
areapoint.x_axisareapoint.y_axis確實不同。 但在我的數據庫。它仍然是一樣的。

+0

不要你需要保存e'areapoint'而不是'obj'?即'obj.areapoint.save()' – AKS

回答

4

在這兩種方法中,您都嘗試更新Area對象而不是AreaPoint對象。

下面是如何,你可以使用這兩種方法做到這一點:

1方法:使用update方法:

# here is what you are doing: 
Area.objects.filter(id=304).update(area_name="today is 1", description="today is 1", areapoint__x_axis=111,areapoint__y_axis=222) 

上面會返回Area的對象,因爲沒有場areapoint__x_axis等它會拋出錯誤。

你可以做的是過濾器上,而不是AreaPoint和更新:

AreaPoint.objects.filter(area_id=304).update(x_axis=111, y_axis=222) 

第二個方法:

obj = Area.objects.get(id=304) 
obj.areapoint.x_axis = 100 
obj.areapoint.y_axis = 200 

# save obj.areapoint instead 
obj.areapoint.save() 

3方法:

areapoint = AreaPoint.objects.get(area_id=304) 
areapoint.x_axis = 100 
areapoint.y_axis = 200 
areapoint.save() 
+0

非常感謝。 ''''obj.areapoint.save()''''救了我的命 – user2492364

相關問題