Обновлять только определенные объекты - PullRequest
0 голосов
/ 19 января 2019

Проблема в моем коде заключается в том, что я делаю какие-либо обновления для своих объектов, особенно модели геометрии. Мой код обновит каждый объект в этой модели с теми же значениями. Пока я завязываю это обновлять каждую строку со своими значениями вместо обновления модели с теми же значениями.

Я пробовал несколько способов, но проблема все еще возникает.

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 голосов
/ 19 января 2019

Метод .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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...