Сохранение модели администратора Django - Обновление существующего объекта - PullRequest
1 голос
/ 20 сентября 2011

Это кажется действительно простым.

На моей модели save() Я хочу в основном сделать get_or_create(). Поэтому я хочу обновить модель, если она существует, или создать новую, если нет.

Кажется, это очень простая проблема, но я не понимаю ее правильно!

class StockLevel(models.Model):
    stock_item = models.ForeignKey(StockItem)
    current_stock_level = models.IntegerField(blank=True, default=0)

    def save(self):
        try:
            # it exists
            a = StockLevel.objects.get(stock_item=self.stock_item)
            a.current_stock_level = self.current_stock_level
            a.save()

        except:
            # is does not exist yet
            # save as normaly would.
            super(StockLevel, self).save()

OR

def save(self):
    stock_level_item , created = StockLevel.objects.get_or_create(stock_item=self.stock_item)
    stock_level_item.current_stock_level = self.current_stock_level
    stock_level_item.save()

Это также войдет в бесконечный цикл.

Это просто поместит save () в бесконечный цикл. Но это основная идея того, как это должно работать.

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Django использует тот же метод save () для создания и обновления объекта. Код пользователя не должен определять, создавать ли или обновлять объект, поскольку это делается самим методом.

Кроме того, вы можете заставить метод save () создать или обновить объект, используя необязательные аргументы метода.

Это описано в Django документах .

1 голос
/ 21 сентября 2011

Это действительно не лучший способ сделать это.Метод save предназначен для сохранения текущего экземпляра, а не для магического запроса существующего.Вы должны позаботиться об этом в форме или просмотреть код.

0 голосов
/ 02 ноября 2018

Так вот как я решил похожую ситуацию только вчера, Я создал дубликат модели для хранения обновленной информации.

давайте назовем новую модель "StockLevelUpdates".

Затем я использовал сигналы для вставки сохраненных данных из исходной модели.

Я буду использовать вашу модель выше в качестве исходной модели для дальнейшего объяснения.

class StockLevelUpdates(models.Model):
    stock_item = models.ForeignKey(StockItem)
    current_stock_level = models.IntegerField(blank=True, default=0)

@receiver(signals.post_save, sender=StockLevel)
def update_info(sender, instance, **kwargs):

    try:
        # if it exists
        a = StockLevelUpdates.objects.get(stock_item=instance.stock_item)
        a.current_stock_level = instance.current_stock_level
        a.save()

    except:
        # if it does not exist yet
        # save the new instance
        obj = StockLevelUpdates(stock_item=instance.stock_item,
                                current_stock_level = instance.current_stock_level)
        obj.save()  

Это хорошо сработало для меня, и вы можете получить все отчеты об обновлениях из дубликата модели.

Возможно, есть лучший способ сделать это, но это был быстрый выход из сложной ситуации.

...