2016-08-30 19 views
1

最初は単純に見えましたが、今は混乱しました。私はデータ構造を書いて、今それを得るのに苦労しています。これまでのところ、私は持っている:django restフレームワーク複数の外部キーをシリアライズ

class Area(models.Model): 
    name = models.CharField(max_length=128) 
    ... 

class Category(models.Model): 
    name = models.CharField(max_length=128) 
    .... 

class Venue(models.Model): 
    name = models.CharField(max_length=128) 
    category = models.ForeignKey(Category, related_name='venues') 
    area = models.ForeignKey(Area, related_name='venues') 

そして、私は必要ではその中に会場でカテゴリを取得PK Areaに基づきます。それはdjangoの残りのフレームワークを使用して行うことは可能ですか?

class VenueSerializer(serializers.ModelSerializer): 
    ..... 

class CategorySerializer(serializers.ModelSerializer): 
    venues = VenueSerializer(read_only=True, many=True) 

    class Meta: 
     model = Category 
     fields = ('pk', 'name', 'venues',) 

class AreaSerializer(serializers.ModelSerializer): 
    categories = CategorySerializer(read_only=True, many=True) 

    class Meta: 
     model = Area 
     fields = ('pk', 'name', 'categories',) 

しかし、もちろんのAreaCategoryに関連直接ないので、これは動作しません。理想的には私はこのようなものが必要

{ 
    "pk": 1, 
    "name": "London", 
    "categories": [ 
     { 
      "pk": 1, 
      "name": "Bars", 
      "venues": [ 
       { 
         "pk": 1, 
         "name": "Cool bar" 
       }, 
       { 
         "pk": 2, 
         "name": "Cooler bar" 
       }, 
       { 
         "pk": 3, 
         "name": "Coldest bar" 
       }, 
      ] 
     } 
    ] 

} 

:結果は次のようになります。だから私の質問はデータ構造を変更せずにこれを行うことは可能ですか?

答えて

2

少し醜いですが、オブジェクトモデルに設定している場合は、DRF's SerializerMethodFieldを使用してください。この構造は、データベースクエリの多くを生成し、最適化しないと

class AreaSerializer(serializers.ModelSerializer): 
    categories = SerializerMethodField() 

    def get_categories(self, obj): 
     # this will find all categories with a venue in given area 
     categories = Category.objects.filter(venues__area=obj) 
     serializer = CategorySerializer(categories, many=True) 
     return serializer.data 

    class Meta: 
     model = Area 
     fields = ('pk', 'name', 'categories',) 

お住まいの地域のシリアライザは、次のようになります。私はDjango's prefetch_related操作を使用して、減少したクエリの数を減らすことをお勧めします。

関連する問題