仅更新特定对象

时间:2019-01-19 12:04:02

标签: python django django-models django-rest-framework

我的代码中的问题是当我对对象(尤其是几何模型)进行任何更新时。我的代码将使用相同的值更新此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
    }
}

1 个答案:

答案 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)。