2016-09-16 8 views
1

私はこれを数日間研究しています。残念ながら、私が今までに見つけた解決策のすべては、私のためにはうまくいきません。手動で複数のDjango QuerySetsを結合し、DRFを使用して結果をシリアライズします

私は手動で2つのDjango QuerySetsを1つのDjangoモデルに結合し、Django Rest Frameworkシリアライザを使用してシリアル化したいと考えています。私はJSONを出力するためにシリアライザを使用します。

私はitertoolsとチェーンの使用を示唆しているので、チェーンの結果をシリアル化する方法は不明です。

ここでの私の目標は、Webアプリケーションのパフォーマンスのためです。各QuerySetは独立して動作しますが、結果を取得するには2つの別々のAjax呼び出しが必要です。私は、Ajaxコールを1つだけ作成し、サーバー側で手動で結果を結合し、結合されたJSONを返す方が好きです。

これは近いですが、DRFシリアライザを使用してチェーンの結果をシリアル化する方法を理解できません。

答えて

1

同じモデルの2つのクエリーセットはありますか?もしそうなら、あなたが言うだけのことができます。

qs1 = RootVegetable.objects.filter(color = VegetableColor.brown) 
qs2 = Potato.objects.filter(size = PotatoSize.large) 

qs2.model = RootVegetable 

# this will return a QS of RootVegetables 
combined_qs = qs1 | qs2 
を:彼らは異なるモデルからですが、モデルは(すなわち、1つの抽象サブクラスである)あなたはまだこれを行うことができ、継承を介して相互に関連している場合は

qs1 = Potato.objects.filter(size = PotatoSize.large) 
qs2 = Potato.objects.filter(color = VegetableColor.brown) 
combined_qs = qs1 | qs2 

これで、結合されたクエリーセットをシリアル化できます。

+0

モデルが関連しているが、一方が他方の抽象サブクラスではありません。

私はリンクが死んで行くという場合には、関連するコードを掲載しています。基本的には、2つのQuerySetsを1つのモデルに接続してから、すべてをシリアル化する方法が必要です。その単一のモデルはアンマネージドモデルです(つまり、対応するデータベーステーブルはありません)。基本的には、関連する一連のデータをまとめてグループ化しようとしています。残念ながら、その提案は本当にあまり役に立ちません。 –

+0

私は近くにあるSO答えへのリンクを追加しました。その結果をシリアライズする方法は説明されていません。特に、シリアライズしているモデルが管理されていない場合は特にそうです。 –

2

グーグルでこの問題の解決のために数日を過ごした後、最終的にはthis pageを見つけました。他の誰かが同じ問題を抱えている場合に備えて、私自身の答えをここに掲載しました。

このテクニックは十分理解しているように思えますが、このテクニックをオンラインで説明するのは難しいです。基本的には、複数のクエリーセットを連鎖し、チェーンをPythonリストに変換します。その後、リストを反復し、手動で正しいシリアライザを呼び出し、辞書に追加します。その後、辞書をJSONにダンプすることができます。

def get_queryset(self): 
     queryset_a = Post.objects.all() 
     queryset_b = FriendRequest.objects.filter(is_unanswered=True) 

     # Create an iterator for the querysets and turn it into a list. 
     results_list = list(chain(queryset_a, queryset_b)) 

     # Optionally filter based on date, score, etc. 
     sorted_list = sorted(results_list, key=lambda instance: -instance.date_created) 

     # Build the list with items based on the FeedItemSerializer fields 
     results = list() 
     for entry in sorted_list: 
      item_type = entry.__class__.__name__.lower() 
      if isinstance(entry, Post): 
       serializer = PostSerializer(entry) 
      if isinstance(entry, FriendRequest): 
       serializer = FriendRequestSerializer(entry) 

      results.append({'item_type': item_type, 'data': serializer.data}) 

     return results 
関連する問題