KWALIFIKACJA HAN2 - TEST WIEDZY NR 1

PYTANIE NR 1.
Przyjrzyj się poniższemu fragmentowi kodu, który jest częścią większego systemu sprzedaży online. Co robi ten kod?
def update_stock(product_id, quantity_sold):
    product = Product.objects.get(id=product_id)
    product.stock -= quantity_sold
    product.save()
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Funkcja pobiera produkt z bazy po identyfikatorze, następnie zmniejsza jego stan magazynowy o sprzedaną ilość (operator -=) i zapisuje zmianę do bazy przez wywołanie zapisu.
Nie tworzy nowego rekordu, nie usuwa produktu i nie modyfikuje ceny, bo zmieniane jest pole stock.

Pełne wyjaśnienie:

Pokazany fragment to funkcja, która ma zaktualizować stan magazynowy po sprzedaży. Najpierw wykonuje się pobranie rekordu produktu z bazy danych po identyfikatorze: metoda objects.get(id=product_id) zwraca konkretny obiekt produktu.

Następnie linia product.stock -= quantity_sold zmniejsza wartość pola stock o liczbę sprzedanych sztuk. Jest to skrót równoważny zapisowi: product.stock = product.stock - quantity_sold. Taka operacja odpowiada realnemu procesowi sprzedaży: jeśli sprzedano 3 sztuki, dostępny zapas powinien spaść o 3.

Na końcu wywołanie product.save() utrwala zmiany w bazie danych. Bez tego krok modyfikacji pozostałby jedynie w pamięci aplikacji, a inne elementy systemu (np. strona produktu, koszyk, panel administracyjny) mogłyby nadal widzieć stary stan magazynowy.

Dlaczego pozostałe odpowiedzi są błędne?

  • "Dodaje nowy produkt do bazy danych" nie pasuje, bo nie ma tu tworzenia obiektu (brak tworzenia nowej instancji i brak zapisu nowego rekordu).
  • "Aktualizuje cenę produktu" jest niezgodne z kodem, ponieważ modyfikowane jest pole stock, a nie pole ceny (np. price).
  • "Usuwa produkt z bazy danych" byłoby związane z operacją usuwania rekordu, której tu nie ma.

W praktycznych systemach sprzedaży online podobna logika jest wykonywana po potwierdzeniu transakcji, a przy dużym ruchu stosuje się dodatkowe zabezpieczenia (np. transakcje), aby uniknąć równoczesnych konfliktów przy zakupie tego samego towaru.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Operator -= oznacza "odejmij i przypisz". W praktyce stock -= quantity_sold jest skrótem zapisu stock = stock - quantity_sold. W kontekście sprzedaży internetowej najczęściej służy do zmniejszenia stanu magazynowego o liczbę sprzedanych sztuk.
To odczyt z bazy danych: aplikacja szuka jednego rekordu produktu o podanym identyfikatorze. Zwraca obiekt, na którym można zmieniać pola (np. stan magazynowy) i potem zapisać zmiany. Jeśli produkt nie istnieje, w typowych rozwiązaniach pojawia się błąd i trzeba go obsłużyć.
Zmiana wartości pola w obiekcie działa najpierw "w pamięci" aplikacji. Dopiero wywołanie save() utrwala modyfikację w bazie danych, dzięki czemu stan magazynowy jest widoczny dla całego systemu sprzedaży (karta produktu, koszyk, rezerwacje, raporty).
Kod mechanicznie odejmie wartość i może doprowadzić do ujemnego stanu magazynowego. Biznesowo zwykle jest to błąd, dlatego w realnych systemach stosuje się walidację (np. blokadę sprzedaży przy braku towaru) albo mechanizmy rezerwacji, aby nie dopuścić do "przedsprzedaży" bez kontroli.
Najczęściej myli się aktualizację istniejącego rekordu z dodawaniem nowego produktu albo z usuwaniem. Częstą pułapką jest też nieuważne czytanie: ktoś widzi "system sprzedaży" i wybiera odpowiedź o cenie, mimo że kod zmienia wyłącznie pole magazynowe (stock).
Tak. To przykład "U" jak Update w CRUD, czyli aktualizacji danych. Najpierw jest odczyt rekordu (Read), potem modyfikacja wartości pola, a na końcu zapis zmian. Nie ma tu tworzenia nowego produktu (Create) ani usuwania rekordu (Delete).
Ponieważ informacja o dostępności wpływa na decyzje klienta i na realizację zamówienia. Aktualne stany ograniczają ryzyko przyjęcia zamówienia na towar, którego nie ma, zmniejszają liczbę anulowań i reklamacji oraz ułatwiają planowanie uzupełnień magazynu i raportowanie sprzedaży.
Zależy od polityki firmy: czasem przy rezerwacji w koszyku, częściej po potwierdzeniu zamówienia lub płatności. Kluczowe jest, aby moment aktualizacji był spójny z obsługą zwrotów i anulowań. W praktyce sklepy łączą to z rezerwacją i późniejszym potwierdzeniem.
Trzeba spojrzeć, które pole obiektu jest modyfikowane. Jeśli zmieniane jest product.stock, dotyczy to zapasu. Gdyby kod zmieniał product.price albo podobne pole, dotyczyłby ceny. Sama nazwa funkcji lub kontekst "sklepu" nie wystarcza.
Tak, przy równoczesnych zamówieniach tego samego produktu może dojść do konfliktów i nieprawidłowych stanów. Dlatego w praktyce stosuje się rozwiązania zapewniające spójność (np. transakcje i kontrolę współbieżności). Na egzaminie warto umieć wskazać, że sam zapis to nie wszystko.
info

To pytanie poprawnie rozwiązuje 66% zdających egzamin. średnie

Źródła:

  • Django Documentation: "Retrieving objects" (QuerySet API) – https://docs.djangoproject.com/en/stable/topics/db/queries/#retrieving-objects (dostęp: 2026-03-02)
  • Django Documentation: "Model instance reference" (save()) – https://docs.djangoproject.com/en/stable/ref/models/instances/#django.db.models.Model.save (dostęp: 2026-03-02)
  • Python Documentation: "Augmented assignment statements" (np. -=) – https://docs.python.org/3/reference/simple_stmts.html#augmented-assignment-statements (dostęp: 2026-03-02)

Materiały:

  • Dokumentacja Django dotycząca pobierania obiektów i pracy z QuerySet
  • Materiały szkoleniowe o podstawach baz danych i CRUD (Create/Read/Update/Delete)
  • Ćwiczenia z czytania krótkich fragmentów kodu i opisywania ich działania własnymi słowami

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego