DaftAcademy / daftacademy-python_levelup-spring2021

19 stars 10 forks source link

Zad. 5.2 #41

Closed absalon221 closed 3 years ago

absalon221 commented 3 years ago

Mam problem z uzyskaniem wartości CategoryID i CategoryName - zawsze są puste. Dodałam ForeignKey i relationship w Models. Problem występuje niezależnie od tego, czy używam joina w crud.

Przykładowa odpowiedź na "/suppliers/25/products": [{"ProductID":55,"ProductName":"Pâté chinois","Category":null,"Discontinued":0},{"ProductID":54,"ProductName":"Tourtière","Category":null,"Discontinued":0}]

Pomocy :(

mateusz94 commented 3 years ago

Cześć,

Z tego co widzę w pliku z migracją sqlową to nie masz tam zdefiniowanych ForeignKey. ForeignKey jest tylko w Twoim kodzie, widzę tu rozbieżność między modelem zdefiniowanym w aplikacji, a tym rzeczywistym w bazie danych.

Może też nie jest wgrany poprawny dump do postgresa na heroku.

absalon221 commented 3 years ago

Czy w takim razie powinnam dodawać ForeignKey w migracji, czy jest jakiś inny sposób na dostanie się do tabeli z kategoriami bez ForeignKey, który mi umyka? Lokalnego postgresa i dumpa robiłam innym sposobem, niż na wykładzie, bo Windows nie współpracował. Wydawało mi się, że inną drogą doszłam do tego samego celu i Heroku ostatecznie przyjął dumpa. Jak mogę zweryfikować poprawność pliku?

mateusz94 commented 3 years ago

zaloguj się do konsoli postgresa na heroku: heroku pg:psql DATABASE--app APP_NAME następnie zobacz czy tabela problemowa tabela zawiera klucz obcy: \d NAZWA_TABELI Jeśli zawiera, to jest ok, jak nie, to musisz napisać migrację bazy danych, na wykładzie pokazywałem migracje pisane w SQLu, które można bezpośrednio wykonać z użyciem klienta psql, czyli tej konsoli do której polecam się zalogować w pierwszym kroku.

Na pytanie czy powannaś dodać ForeignKey w migracji odpowiadam: Też. W migracji sqlowej i w swoim kodzie. Inaczej powstaje rozbieżność i ORM nie jest w stanie stworzyć poprawnego zapytania, ponieważ spodziewa się innego stanu bazy danych.

korowiov commented 3 years ago

Radzę przejrzeć plik schemas.py oraz models.py i zobaczyć czy nazwy kolumn się zgadzają ;)

edt. użycie optional trochę zamazuje obraz i nie rzuca błędu ;)

absalon221 commented 3 years ago

Zrobiłam nową migrację z dodanymi kluczami, wsadziłam na Heroku. Mam nadal foreignkey i relationship w models oraz joina w crud. Nazwy kolumn do schemas skopiowałam z models i usunęłam optional, żeby pokazywał się błąd. Nadal nie mogę się dostać do tabeli categories.

korowiov commented 3 years ago

No z tego co widzę nadal jest ten błąd ;)

To jest Pani schema odpowiedzi:

class SupplierProduct(BaseModel):    
  ProductID: int
  ProductName: str    
  Category: Category    
  Discontinued: int        

  class Config:        
    orm_mode = True

A to jest Pani model:

class Product(Base):
    __tablename__ = 'products'

    ProductID = Column(SmallInteger, primary_key=True, server_default=text("nextval('products_productid_seq'::regclass)"))
    ProductName = Column(String(40), nullable=False)
    SupplierID = Column(SmallInteger, ForeignKey("suppliers.SupplierID"))
    CategoryID = Column(SmallInteger, ForeignKey("categories.CategoryID"))
    QuantityPerUnit = Column(String(20))
    UnitPrice = Column(Float)
    UnitsInStock = Column(SmallInteger)
    UnitsOnOrder = Column(SmallInteger)
    ReorderLevel = Column(SmallInteger)
    Discontinued = Column(Integer, nullable=False)

    supplier = relationship('Supplier', back_populates='products')
    category = relationship('Category', back_populates='products')

Proszę wziąć dwa głębokie oddechy i jeszcze raz przemyśleć ;)

absalon221 commented 3 years ago

Ciężka przeprawa, ale dałam radę. Dziękuję za pomoc!