我的代码中的问题是当我对对象(尤其是几何模型)进行任何更新时。我的代码将使用相同的值更新此Model中的每个对象。我要绑定的是用其值更新每一行,而不是使用相同的值更新模型。
我尝试了几种方法,但问题仍然存在。
def update(self, instance, validated_data):
geo = address_data.get('geo')
lat = geo.pop('lat')
lng = geo.pop('lng')
...
gathers = geometry.objects.update(lat=lat, lng=lng)
address = Address.objects.update(address=address, country=country, description=description, geo=gathers )
...
user_data = validated_data.pop('user')
username = user_data.pop('username')
user = User.objects.update(username=username)
gather = userProfile.objects.update(address=address, user=user)
return instance.
class geometry(models.Model):
lat = models.IntegerField(default='')
lng = models.IntegerField(default='')
class Address(models.Model):
...
geo = models.OneToOneField(geometry, on_delete=models.CASCADE, default='')
class userProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, name='user', primary_key=True)
address = models.OneToOneField(Address, on_delete=models.CASCADE, name='address')
问题是我的代码使用相同的值更新了模型中的整个行。
{
"address": {
"id": 1,
"address": "2,lot chragua",
"country": "Morocco",
"description": "dfvfdv",
"geo": {
"id": 1,
"lat": 471,
"lng": 39
}
},
"user": {
"id": 1,
"username": "sdfvedfbf",
"first_name": "",
"last_name": "",
"email": "",
"date_joined": "2019-01-19T11:31:00.415990Z",
"last_login": null
}
},
{
"address": {
"id": 2,
"address": "2.Lot Chraga",
"country": "Morocco",
"description": "sfvsfv",
"geo": {
"id": 2,
"lat": 471,
"lng": 39
}
},
"user": {
"id": 2,
"username": "svscwdc",
"first_name": "",
"last_name": "",
"email": "",
"date_joined": "2019-01-19T11:36:50.266225Z",
"last_login": null
}
}
答案 0 :(得分:0)
.update()
方法用于更新多个对象。如您所知,它将更新查询集中的所有对象。
如果我对您的理解正确,那么您想更新一个实例,但是从您的代码中,我不清楚是哪个实例。
您可以按照@ozcanyarimdunya的建议过滤查询集:
geometry.objects.filter(pk=geo_pk).update(...)
请注意,.update()
不会在模型上调用.save()
或发出任何信号。要更新单个对象,通常最好将新值分配给实例并调用save,如下所示:
geo = geometry.objects.get(pk=geo_pk)
geo.lat = lat
geo.lon = lon
geo.save()
顺便说一句,通用约定是将类名大写(Geometry
而不是geometry
)。