2012-10-05 6 views
5

Czy możliwe jest uwzględnienie pól w powiązanych modelach za pomocą funkcji tastypie?Tastypie uzyskujący dostęp do pól z dziedziczonych modeli

Zgodnie z moimi modelami poniżej: jeśli zachowam jedną treść wideo i jedną instancję TextContent do bazy danych, mogę odzyskać 2 obiekty z mojego zasobu treści, ale żadne z dodatkowych pól nie są dostępne.

Czy możliwe jest dołączenie pól z powiązanych modeli (w tym przypadku adresu URL wideo i treści tekstowej) i które będą uwzględniały dodawanie kolejnych typów Treści w przyszłości bez konieczności przepisywania Zasobu Treści, czy też nadchodzę w tym z niewłaściwego kierunku?

Celem jest, aby móc rozszerzyć to z większą ContentTypes bez konieczności dokonywania zmian w treści zasobu (zakładając, że jest to możliwe, aby dostać pracę w pierwszej kolejności)

models.py:

class Content(models.Model): 
    parent = models.ForeignKey('Content', related_name='children', null=True, blank=True) 

class TextContent(Content): 
    text = models.CharField(max_length=100) 

class VideoContent(Content): 
    url = models.CharField(max_length=1000) 

a następnie moje zasoby:

class ContentResource(ModelResource): 
    children = fields.ToManyField('myapp.api.resources.ContentResource', 'children', null=True, full=True) 

    class Meta: 
     resource_name = 'content' 
     queryset = ContentResource.objects.all() 
     authorization = Authorization() 
     always_return_data = True 

Odpowiedz

2

znalazłem dobre rozwiązanie w innym odpowiedź

Populating a tastypie resource for a multi-table inheritance Django model


Zabrakło mi do tego samego problemu - chociaż wciąż jestem w trakcie rozwiązywania go. Dwie rzeczy, które do tej pory wymyśliłem:

django-model-utils udostępnia menedżer dziedziczenia, który pozwala użyć abstrakcyjnej klasy bazowej do zapytania o tabelę i może automatycznie obniżyć wyniki zapytania.

Jedną z rzeczy, na które należy zwrócić uwagę, są dostępne metody klasy zasobów dostępne w postaci dehydrate/rehydrate.

To co zrobiłem:

class CommandResource(ModelResource): 

    class Meta: 
     queryset = Command.objects.select_subclasses().all() 

że tylko dostaje pół drogi - zasób musi również zawierać dwuwodny/nawodnienia rzeczy, bo trzeba ręcznie pakietu obiektu aż do transmisji (lub ODBIORCZA) od użytkownika.

Rzeczą, o której teraz wiem, jest to, że jest to super hacky i musi być lepszy/czysty sposób dostarczony przez tastypie - nie mogą oczekiwać, że będziesz musiał wykonywać tego typu ręczne przepakowywanie w takich sytuacjach - ale może robią. Mam tylko 8 godzin doświadczenia z tastypie @ w tym punkcie, więc jeśli wytłumaczę to wszystko źle, być może jakiś miły użytkownik stackoverflow może ustawić mnie prosto. : D: D: D

0

Miałem ten sam wymóg i ostatecznie go rozwiązałem.

Nie podobała mi się odpowiedź podana w powyższym linku, ponieważ nie podobał mi się pomysł połączenia zestawu zapytań i ponownego sortowania.

Podobno można dziedziczyć wiele zasobów.

Dzięki podklasowaniu wielu zasobów uwzględniane są pola zasobów.
A ponieważ te pola są unikalne dla każdego zasobu, ustawiłem je jako wartości null w init.

Zastanawiam się, czy istnieje sposób na liście rodziców tylko raz. (Teraz są dwa: jeden do podklasy, a drugi do meta)

class SudaThreadResource(ThreadResource): 

    def __init__(self, *args, **kwargs): 
     super(SudaThreadResource, self).__init__(*args, **kwargs) 

     for field_name, field_object in self.fields.items(): 
      # inherited_fields can be null                                                          
      if field_name in self.Meta.inherited_fields: 
       field_object.null=True 

    class Meta(ThreadResource.Meta): 
     resource_name = 'thread_suda' 
     usedgoodthread_fields = UsedgoodThreadResource.Meta.fields[:] 
     userdiscountinfothread_fields = UserDiscountinfoThreadResource.Meta.fields[:] 
     staffdiscountinfothread_fields = StaffDiscountinfoThreadResource.Meta.fields[:] 
     bitem_checklistthread_fields = BitemChecklistThreadResource.Meta.fields[:] 

     parent_field_set = set(ThreadResource.Meta.fields[:]) 

     field_set = set(
      set(usedgoodthread_fields) | 
      set(userdiscountinfothread_fields) | 
      set(staffdiscountinfothread_fields) | 
      set(bitem_checklistthread_fields) 
     ) 

     fields = list(field_set) 
     inherited_fields = list(field_set - parent_field_set) 


     queryset = forum_models.Thread.objects.not_deleted().exclude(
      thread_type__in=(forum_const.THREAD_TYPE_MOMSDIARY, forum_const.THREAD_TYPE_SOCIAL_DISCOUNTINFO) 
     ).select_subclasses()