Почему поле объекта в модульном тесте не изменяется в Django

Я не понимаю, почему мой тест не работает. У меня есть страница с товаром. Есть форма с кнопкой 'Купить товар'. После нажатия этой кнопки, если у клиента достаточно денег, товар будет куплен и количество денег на счету изменится. Но в моем тесте количество денег после покупки товара остается прежним, хотя объект (купленный товар) будет создан.

Модель приобретенного товара:

class BoughtItem(models.Model):
    name = models.CharField(max_length=100, verbose_name='Название товара или акции', blank=True)
    price = models.IntegerField(verbose_name='Цена', blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

Модель профиля:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    money = models.IntegerField(default=0)

Форма:

class BuyForm(forms.ModelForm):

    class Meta:
        model = BoughtItem
        fields = ('name',)
        widgets = {'name': forms.HiddenInput()}

view:

class ItemDetailView(generic.DetailView):
    model = Item
    template_name = 'item_detail.html'
    context_object_name = 'item'

    def get_object(self, queryset=None):
        return get_object_or_404(Item, pk=self.kwargs.get('pk'))

    def post(self, request, *args, **kwargs):
        buy_form = BuyForm(request.POST)
        if buy_form.is_valid():
            purchase = buy_form.save(commit=False)
            item = self.get_object()
            user = Profile.objects.get(user__username=request.user.username)
            if user.money >= item.price:
                sum_difference = user.money - item.price
                user.money = sum_difference
                user.save()
                purchase.name = item.name
                purchase.price = item.price
                purchase.save()
                return HttpResponseRedirect(reverse('account', kwargs={'username': request.user.username}))
            else:
                return HttpResponseRedirect(reverse('purchase_error'))
        else:
            return render(request, 'item_detail.html',
                          context={'buy_form': buy_form, 'object': self.get_object()})

Урлы:

urlpatterns = [
    path('shop_list/', ShopListView.as_view(), name='shop_list'),
    path('<str:name>', ItemListView.as_view(), name='shop_detail'),
    path('item/<int:pk>', ItemDetailView.as_view(), name='item_detail'),
    path('purchase_error/', purchase_error, name='purchase_error'),
]

тест:

class ShopTest(TestCase):
    @classmethod
    def setUpTestData(cls):
        Shop.objects.create(
            name='Samsung',
            description='Магазин электроники',
        )
        Item.objects.create(
            name='Телефон Samsung A50',
            description='Описание телефона',
            price=20000,
            shop_id=Shop.objects.get(name='Samsung').pk
        )

        user = User.objects.create(username='testuser')
        user.set_password('12345')
        user.save()

        Profile.objects.create(
            user=user,
            money=100000
        )

    def test_if_change_field_money_after_purchase(self):
        self.client.login(username='testuser', password='12345')
        user = Profile.objects.get(user__username='testuser')
        item = Item.objects.get(pk=1)
        self.client.post(reverse('item_detail', kwargs={'pk': item.pk}))
        self.assertNotEquals(user.money, 100000)

Изменения были сохранены в БД, но ваш объект все еще содержит старые данные, вызовите instance.refresh_from_db() для получения последних данных из БД

def test_if_change_field_money_after_purchase(self):
    self.client.login(username='testuser', password='12345')
    user = Profile.objects.get(user__username='testuser')
    item = Item.objects.get(pk=1)

    user.refresh_from_db()

    self.assertNotEquals(user.money, 100000)
Вернуться на верх