Django Model.objects.last() 返回倒数第二个实例而不是最后一个实例

发布于 2025-01-16 06:31:54 字数 2460 浏览 2 评论 0原文

我正在构建一个 Django 应用程序,该应用程序是一个针对假设的餐厅的自动更新库存应用程序。我有一个模型“Purchase”,它使用另一个模型“Register”作为外键字段。我将其设置为对 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)

当进行新购买时,我还会在后台发出信号,这是否可能是问题的一部分?

@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

此外,这是我在另一个模型 MenuItem 中创建的函数,该函数在后台运行以提供该 Register 的购买计数。

def sales(self):
        count = 0
        for i in self.purchase_set.all():
            if i.register == Register.objects.order_by("id").last():
                count += 1
        count = str(count)
        return count

有什么想法为什么 Register.objects.last() 不返回实际的最后一个实例吗?

I'm in the process of building a Django app, which is meant to be a self updating inventory app for a hypothetical restaurant. I have a model, "Purchase", which uses another model "Register" as a ForeignKey field. I have it set the reference to the last instance created of Register so that any entree purchase is linked to the currently active register at the store. The problem is that when a Purchase instance saves, it keeps referencing the second to last Register object instead of the last.

Here is the current model code for those two models:

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)

I also have a Signal going on in the background when a new Purchase is made if that might be part of the issue?

@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

Additionally this is the function I created inside another model, MenuItem, that is running in the background to provide the Purchase count for that Register

def sales(self):
        count = 0
        for i in self.purchase_set.all():
            if i.register == Register.objects.order_by("id").last():
                count += 1
        count = str(count)
        return count

Any ideas why Register.objects.last() isn't returning the actual last instance?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文