2012-10-05 43 views
5

是否可以使用tastypie在相關模型中包含字段?Tastypie訪問來自繼承模型的字段

按我下面的模型:如果我堅持一個VideoContent和一個實例的TextContent到數據庫,然後我就可以從我的內容資源2點的對象,但是,沒有附加字段都可用。

是否可以包含來自相關模型的字段(在本例中爲視頻url和文本內容),並且可以滿足未來添加更多內容類型的需求,而無需重寫Content Resource,或者我來從這個錯誤的方向?

我們的目標是能夠在不必修改的內容資源更CONTENTTYPES擴展(假設有可能把它擺在首位的工作)

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) 

然後我的資源:

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 

回答

2

我發現了另一個答案一個很好的解決方案

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


我碰到了同樣的問題 - 儘管我仍然在解決它的中間。目前爲止我已經弄清了兩件事:

django-model-utils提供了一個繼承管理器,可以讓您使用抽象基類來查詢它的表,並且可以自動向下查詢結果。

有一點要看看是提供給資源類dehydrate/rehydrate方法。

這是我做過什麼:

class CommandResource(ModelResource): 

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

這只是讓你一半 - 資源還必須包括脫水/水化的東西,因爲你必須手動包對象了傳輸(或recieving )來自用戶。

我現在意識到的事情是,這是超級哈希,並且必須有一個更好/更清潔的方式提供tastypie - 他們不能指望你必須做這種類型的手動重新包裝在這些類型的情況 - 但是,也許他們會這樣做。我只有8個小時的tastypie @這一點經驗,所以如果我解釋這一切都錯了,也許一些不錯的計算器用戶可以設置我的直線。 :d:d:d

0

我有同樣的要求,終於解決了這個問題。

我不喜歡在上面給出的鏈接,因爲我不喜歡組合查詢集和重新排序的想法的答案。

顯然,您可以繼承多個資源。

通過繼承多個資源,包括資源的領域。
而且由於這些字段對每個資源都是唯一的,所以我在init中將它們設爲空。

想知道是否有辦法只列出父母一次。 (現在有兩個,一個用於分類,一個用於分類)

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()