Django Model.objects.last() возвращает предпоследний, а не самый последний экземпляр

Я нахожусь в процессе создания приложения Django, которое должно быть самообновляющимся приложением инвентаризации для гипотетического ресторана. У меня есть модель "Purchase", которая использует другую модель "Register" в качестве поля ForeignKey. Я установил в ней ссылку на последний созданный экземпляр Register, чтобы любая покупка блюда была связана с текущей активной кассой в магазине. Проблема в том, что когда экземпляр Purchase сохраняется, он продолжает ссылаться на предпоследний объект Register вместо последнего.

Вот текущий код модели для этих двух моделей:

class Register(models.Model):
    daily_bank = models.FloatField(default=500)
    amount_spent = models.FloatField(default=0)
    amount_made = models.FloatField(default=0)
    date = models.DateField(default=date.today) 
    def sales(self):
        lst = []
        for p in self.purchase_set.all():
            if p.menu_item not in lst:
                lst.append([p.menu_item.title, 1])
            else:
                for entry in lst:
                    if entry[0] == p.menu_item.title:
                        entry[1] = entry[1] + 1
        return lst
    def profit(self):
        if self.id > 1:
            return self.daily_bank - Register.objects.get(id=self.id-1).daily_bank
        else:
            return self.daily_bank - 500
    def last(self):
        return self == Register.objects.last()

class Purchase(models.Model):
    menu_item = models.ForeignKey(MenuItem, on_delete=SET_NULL, null=True)
    time = models.DateField(default=datetime.now)
    item_name = models.CharField(max_length=100)
    register = models.ForeignKey(Register, on_delete=CASCADE, default=Register.objects.last())
    def save(self, *args, **kwargs):
        self.item_name = self.menu_item.title
        if self.pk is None:
            for i in self.menu_item.reciperequirment_set.all():
                if i.menu_item == self.menu_item:
                    i.ingredient.quantity -= i.required_amount 
                    i.ingredient.save()
        super(Purchase, self).save(*args, **kwargs)

У меня также есть Signal, работающий в фоновом режиме при создании новой Покупки, может ли это быть частью проблемы?

@receiver(post_save, sender=Purchase)
def sale(sender, instance, created, **kwargs):
    if created:
        n = Register.objects.last()
        n.daily_bank += instance.menu_item.price
        n.amount_made += instance.menu_item.price 
        n.save()
    else:
        pass

Есть идеи, почему Register.objects.last() не возвращает реальный последний экземпляр?

Определение значения по умолчанию для вашей ссылки здесь (т.е. Register) работает только один раз при создании объекта (также обратите внимание, что если у вас нет ни одной записи Register в вашей таблице, то при сохранении объектов произойдет сбой), но в любом случае есть один простой способ сделать это. Вы можете переопределить метод сохранения Register (таким образом вы можете изменить вашу модель покупки, чтобы всегда иметь последнюю запись, когда кто-то создает новую запись Register):

class Register(models.Model):
    ... some code lines...

    def save(self, *args, **kwargs):
        created = self.id is None
        super(Register, self).save(*args, **kwargs)

        if created:
            Purchase.objects.all().update(register=self)
            # this part update all of your Purchase records
            # but if you want you can also change it to update some 
            # specific records like Purchase.objects.filter(id__in=[1, 2, ...]).update(register=self)
Вернуться на верх