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)