Django Model.objects.last() 返回倒数第二个实例而不是最后一个实例
我正在构建一个 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论