Я все еще новичок в этом языке, поэтому мои реализации могут быть неправильными. Я получаю эту ошибку при тестировании методов в моих моделях в Django с модульным тестированием. Проблема в том, что две разные функции имеют одинаковую реализацию, но только одна из них вызывает ошибку.
Может ли кто-нибудь объяснить, почему это происходит, и предложить какие-либо подсказки, как решить эту проблему?
Спасибо
Вот функции в models.py :
class Staff(models.Model):
------------------------
# Get the current (latest) commission the staff has at the moment (Function 1)
@property
def current_commission(self):
return Commission.objects.filter(staff=self).latest('date_applied').sale_commission
class Sale(models.Model):
staff_id = models.ForeignKey(Staff, on_delete=models.CASCADE)
product_id = models.ForeignKey(LemonadeProduct, on_delete=models.DO_NOTHING)
quantity = models.IntegerField(default=1)
date_sale = models.DateTimeField(auto_now=True)
#(Function 2)
@property
def get_staff_commission(self):
commission = Commission.objects.filter(staff=self.staff_id, date_applied__lte=self.date_sale).latest('date_applied')
return "%.2f" % (self.product_id.price * self.quantity * (commission.sale_commission / 100))
Вот мои тестовые примеры в tests.py (обновлено):
def create_commission(commission, days, staff):
time = timezone.now() + datetime.timedelta(days=days)
return Commission.objects.create(sale_commission=commission, date_applied=time, staff=staff)
# Create your tests here.
class StaffModelTestCase(TestCase):
def test_current_commission(self):
staff_1 = Staff(name='A', position='B')
staff_1.save()
com_1 = create_commission(10, 0, staff_1)
com_1.save()
# No errors in this line
self.assertEqual(staff_1.current_commission, 10)
class SaleModelTestCase(TestCase):
def setUp(self):
time = timezone.now()
staff = Staff(name="C", position="B")
staff.save()
product = LemonadeProduct(name="Lemonade", price=20)
product.save()
sale_1 = Sale(staff_id=staff, product_id=product, quantity=1)
sale_1.save()
sale_2 = Sale(staff_id=staff, product_id=product, quantity=2)
one_week = timezone.now() + datetime.timedelta(days=7)
sale_2.save()
sale_2.date_sale = one_week
sale_2.save()
# The date for sale_2 is not updated because of auto_now=True -> editable=False
def test_get_staff_commission(self):
test_sale_1 = Sale.objects.get(quantity=1)
test_sale_2 = Sale.objects.get(quantity=2)
staff = Staff.objects.get(name="C")
# Change `0` into `-1` to ensure that this commission has its date being less than the date of the sales
first_commission = create_commission(10, 0, staff)
first_commission.save()
# After the change, no 'Commission matching query does not exist' error.
self.assertEquals(test_sale_1.get_staff_commission, "2.00")
Решение:
Я понимаю, что неправильно понимаю auto_now = True в DateTimeField в классе Sale. Следовательно, дата для sale_2 не будет обновляться. Кроме того, first_commission создается с текущим datetime ( days = 0 ) после продаж, ведущих к тому факту, что его дата будет больше даты в продажах. Это приводит к набору / объекту NULL для комиссии в функции 2.
Исправления можно увидеть в обновленных кодах.