2012-10-05 12 views
5

tastypieを使用して関連するモデルにフィールドを含めることはできますか?以下の私のモデルを1として継承されたモデルのフィールドにアクセスするTastypie

:私はDBに1 VideoContentと1つのTextContentインスタンスを永続化する場合、私はその後、私のコンテンツリソースからバック2つのオブジェクトを取得することができますが、しかし、追加フィールドのどれも用意されていません。

関連するモデルのフィールド(この例では、ビデオのURLとテキストのコンテンツ)を含めることは可能ですか?今後、コンテンツリソースを書き換えなくても、これは間違った方向からですか?

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) 

目標は、コンテンツのリソースに変更を加えることなく、より多くのcontenttypesのでこれを拡張することができることです

Models.py(それが最初の場所での作業を取得することが可能ですと仮定)

そして、私の資源:

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時間しかないので、これをすべて間違って説明していれば、おそらく素敵なstackoverflowユーザが私をまっすぐに設定することができます。 :D:D:D

0

私は同じ要件を持っていたし、最終的にそれを解決しました。

私はクエリセットを組み合わせ、再仕分けのアイデアを好きではなかったので、私は上記のリンクで与えられた答えを好きではなかったです。

どうやら、あなたは複数のリソースを継承することができます。

複数のリソースをサブクラス化することで、あなたは、リソースのフィールドが含まれます。
これらのフィールドは各リソース固有のものなので、initでnullableにしました。

親が一度だけリストする方法があるのだろうかと思います。 (今は2つ、サブクラスには1つ、メタには1つ)

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() 
関連する問題