mozeskomentuje
Hej pytanko do #python #django #restapi i ogólnie #webdev , #webdesign

Przykładowo mamy jakiś model np samochody i konkretne części do tych samochodów jeśli chcę na stronie pokazać listę samochodów i w detailu mieć możliwość wyświetlenie dodania edycji i usunięcia części dostępnych na stronie to które rozwiązanie jest poprawne/lepsze?

1) samochody/ - lista samochodów ;
samochody// - opis samochodu plus dodany "atrybut" modelu części samochodowych z listą (przykładowo 'części samochodowe" : [{"id" :.. ,} {'id': ...}] - na tym url możliwość dodania edycji i usunięcia cześci samochodowych

2) samochody/ - lista samochodów ;
samochody// - opis samochodu , 'cześci samochodowe" - hyperlink=samochody//czescisamochodowe/ ,
samochody//czesci
samochodowe/ i w tym url części samochodowych lista części samochodowych z możliwością dodawania edycji usuwania części z bazy danych

3) samochody/ - lista samochodów ;
samochody// - opis samochodu , 'cześci samochodowe" - hyperlink=samochody//czescisamochodowe/ ,
samochody//czesci
samochodowe/ - lista (tylko metoda get dostępna),
samochody//dodajczescisamochodowe/ - (post)dodawanie cześci
samochody//edycjaczescisamochodowe/ - (put) edycja czesci
samochody//usunczescisamochodowe/ - (delete) usuwanie czesci

*myśle jeszcze nad
4) samochody/ - lista samochodów ;
samochody// - opis samochodu , 'cześci samochodowe" - hyperlink=samochody//czescisamochodowe/ ,
samochody//czesci
samochodowe/ - lista (tylko metoda get dostępna),
samochody//czescisamochodowe/dodaj/ - (post) dodawanie nowych czesci
samochody//czesci
samochodowe// - edycja lub usuwanie czesci

- tylko nie wiem jak to w viewsetcie zrobić (w Django-rest-framework) sensie mam podstawy serializer samochody pozniej jako nowa funkcje z decoratorem action robię czesci_samochodowe a jak odwołać się do tych czesci samochodowych żęby uworzyć kolejna fukcje lub dojśc do detaila cześci jeszcze nigdzie się nie dowiedziałem tego

wszystko to chce zrobić przez viewsets w Django-Rest-Frameworku - za każde rady, hejty będe bardzo wdzięczny ;)

#python #webdev #naukaprogramowania #programowanie #programista15k #pomocy
  • Najlepsze
  • Wszystkie komentarze
GlenPL
@mozeskomentuje: 4) tylko bez tego dodaj w url - od tego masz metody http, get i post niech uderzają w ten sam url

generalnie to co jest w linku nie powinno dublować metody [tak jak to robisz w 3)]
Tank1991
@mozeskomentuje: hmm:

PUT samochody/ => tworzenie nowego obiektu
PATCH samochody// = >modyfikacja
GET samochody// => wyciagniencie pojedynczej instancji
GET samochody/ => lista instancji zdefiniowana na polu
mozeskomentuje
mozeskomentuje Autor
0
@GlenPL: ok kumam czyli w samochody//czesci_samochodowe/ wyświetlać lista przy metodzie get a przy post dodawać nowa

A czy ktoś ogarnia Django Rest Framework i wie jak sie dostać do takiego detaila powiązanego z pierworodnym serializerem decoratorem action?
GlenPL
@mozeskomentuje: nie piszę w DRF, ale chyba potrzebujesz tu 2 viewsety - jeden wpinasz na route samochody a drugi na samochody//czesci_samochodowe i masz wtedy dostęp elegancki do wszystkiego, viewset sam ogarnie list i get dla czescisamochodowe

gdzies tam się jeszcze ogranicza queryset żeby były w nim tylko części z tego samochodu którego car_pk dostałeś, doczytaj, będzie to na 100% w tutorialu dowolnym


pytanie brzmi jakbyś próbował zbytnio kombinować :)
Tank1991
@mozeskomentuje: https://www.django-rest-framework.org/api-guide/viewsets/
interesuje cie pierwszy przyklad z UserViewSet

co do dostawania sie do metod to jest to opisane w sekcji ViewSet actions

ale lepiej dac serializer i to na nim zdefiniowac akcje dla put /add etc
mozeskomentuje
mozeskomentuje Autor
0
@Tank1991: kumam ale jak ustawić wg dostępnosc tych stron dla części samochodowych w takich przypadkach, bo to by trzeba ustawić detail do detaila i nie wiem i narazie nie moge znaleźć jakiejś podpowiedzi do tego przypadku
kgajowy
kgajowy
@Tank1991: 99% przypadków POST tworzy zasób, PUT go modyfikuje.
Druga najważniejsza różnica, to PUT jest idempotentny (tj wielokrotne wywołanie niczego nie zmieni /ew poza updatedAt, jeżeli wymuszasz/)