2012-05-06 17 views
6

Pracuję z kilkoma prostymi zasobami django-tastypie z następującym problemem:Jak mogę uczynić Django-Tastypie nadpisać zasób, jeśli już istnieje?

Wyobraź sobie, że tworzę prosty system oceniania. Mam zasób, nazywam go Rating, który ma zarówno User, jak i . Każdy użytkownik ma najwyżej jedną ocenę na komentarz.

Chciałbym utworzyć ogólny zasób, który zajmuje krotkę ('user', 'comment'). Następnie za każdym razem, gdy robię POST z nowym Rating, chcę sprawdzić pola user i comment, aby zobaczyć, czy ocena pasująca do obu tych pól już istnieje. Jeśli tak, nadpisz istniejący zasób, w przeciwnym razie utwórz nowy zasób (aby każde wywołanie API zawsze przepuszczało Django unique_together).

Pracuję z obj_get jako punktem wyjścia, ale mając trudności ze zrozumieniem, jak poprawnie zastąpić to, aby uzyskać to zachowanie.

Odpowiedz

6

Po dyskusji na IRC w #tastypie:

Zaleca się nie zmieniać standardowego zachowania API, ponieważ może to być niebezpieczne w tym sensie, że klienci nie będzie widać konsekwentne zachowanie całej API.

Jednym z rozwiązań jest umożliwienie Tastypie zwrócenia odpowiedzi 4xx podczas próby utworzenia Rating, w tym przypadku klient będzie PATCH istniejącej oceny.

Jeśli jednak zwiększenie wydajności jest konieczne, naprawdę, należy zmienić zachowanie tylko wtedy, gdy klient formalnie o to poprosi. Co w twoim przypadku oznaczałoby dodanie parametru replace_existing_rating=True do żądania POST.

Więc w twoim przypadku, jeśli nie zdecydować trzeba się wzrost wydajności, można:

class CommentResource(ModelResource): 
    def obj_create(self, bundle, request=None, **kwargs): 
     if bundle.data.get("replace_existing_rating", False): 
      try: 
       bundle.obj = self._meta.object_class._default_manager.get(**conditions) 
      except self._meta.object_class.DoesNotExist: 
       bundle.obj = self._meta.object_class() 
Powiązane problemy