Django Test DoesNotExist: ошибка «соответствующий запрос не существует» при тестировании функций в моделях - PullRequest
0 голосов
/ 25 мая 2020

Я все еще новичок в этом языке, поэтому мои реализации могут быть неправильными. Я получаю эту ошибку при тестировании методов в моих моделях в 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.

Исправления можно увидеть в обновленных кодах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...