2016-09-25 25 views
2

私は住んでいるコンドームのための簡単なデータベースを作成しています。人、ユニット、ユニットタイプ(住居と駐車スペース)、および単価テーブル人とユニットとの多対多の関係) - 駐車スペースを借りている間に、1人が「家」のユニットタイプの所有者になることがあります。データの代わりにオブジェクトを返すDjango RESTフレームワークシリアライザ

class PersonViewSet(viewsets.ModelViewSet): 
    queryset = Person.objects.all() 
    serializer_class = PersonSerializer 

class UnitHolderTypeViewSet(viewsets.ModelViewSet): 
    queryset = UnitHolderType.objects.all() 
    serializer_class = UnitHolderTypeSerializer 

class UnitViewSet(viewsets.ModelViewSet): 
    queryset = Unit.objects.all() 
    serializer_class = UnitSerializer 

class UnitHolderViewSet(viewsets.ModelViewSet): 
    queryset = UnitHolder.objects.all() 
    serializer_class = UnitHolderSerializer 

class UnitTypeViewSet(viewsets.ModelViewSet): 
    queryset = UnitType.objects.all() 
    serializer_class = UnitTypeSerializer 

これは私のシリアライザです::これは私の見解である

class Person(models.Model): 
    first_name = models.CharField(max_length=30, null=False) 
    last_name = models.CharField(max_length=30, null=False) 
    phone = models.CharField(max_length=20) 
    email = models.EmailField(max_length=20) 

class UnitType(models.Model): 
    description = models.CharField(max_length=30) 

class Unit(models.Model): 
    unit_number = models.IntegerField(null=False, unique=True) 
    unit_type = models.ForeignKey(UnitType, null=False) 
    unitholders = models.ManyToManyField(Person, through='UnitHolder') 

class UnitHolderType(models.Model): 
    description = models.CharField(max_length=30) 

class UnitHolder(models.Model): 
    person = models.ForeignKey(Person) 
    unit = models.ForeignKey(Unit) 
    unitholder_type = models.ForeignKey(UnitHolderType) 

この

は私のモデルである

class UnitSerializer(serializers.ModelSerializer): 
    unit_type = serializers.SlugRelatedField(
     queryset=UnitType.objects.all(), slug_field='description' 
    ) 

    class Meta: 
     model = Unit 
     fields = ('unit_number', 'unit_type', 'unitholders') 

class UnitTypeSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = UnitType 

class PersonSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Person 

class UnitHolderSerializer(serializers.ModelSerializer): 
    person = serializers.PrimaryKeyRelatedField(many=False, read_only=True) 
    unit = serializers.PrimaryKeyRelatedField(many=False, read_only=True) 

    class Meta: 
     model = UnitHolder 
     fields = ('person', 'unit', 'unitholder_type') 

class UnitHolderTypeSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = UnitHolderType 

問題:

私は照会/ unitsエンドポイントl IKE以下:

u = requests.get('http://localhost:8000/units').json() 

私の応答は次のようになります。

[{'unit_type': 'Home', 'unit_number': 614, 'unitholders': [1]}] 

私は戻って欲しいことは、このようなものです:

[ 
    { 
     'unit_type': 'Home', 
     'unit_number': 614, 
     'unitholders': [ 
      { 
       'id: 1, 
       'first_name': 'myfirstname', 
       'last_name': 'mylastname', 
       'unitholder_type': 'renter' 
      } 
     ] 
    } 
] 

私は私の問題は、私の中でかなり確信していますUnitSerializerを使用していますが、私はDRFにはまったく新しいものですが、ドキュメントを読んでいますが、まだそれを理解できていないようです。

答えて

0

おそらく、あなたがやっている必要があり代そうは:

class UnitHolderViewSet(viewsets.ModelViewSet): 
    queryset = UnitHolder.objects.all() 
    unitholders = UnitHolderSerializer(read_only=True, many=True) 

Django rest framework serializing many to many field

+0

hmm。ありがとう。私はそれを私の見解に加えましたが、効果はありませんでした。 [{'unit_type': 'Home'、 'unit_number':614、 'unitholders':[1]}] – Progger

3

簡単な解決策は、depthオプションを使用して、次のようになります。

class UnitSerializer(serializers.ModelSerializer): 
    unit_type = serializers.SlugRelatedField(
     queryset=UnitType.objects.all(), slug_field='description' 
    ) 

    class Meta: 
     model = Unit 
     fields = ('unit_number', 'unit_type', 'unitholders') 
     depth = 1 

これは、すべてのネストされた関係に深い1つのレベルをシリアル化します。あなたがネストされた各フィールドがシリアライズ取得する方法を細かく制御したい場合は、明示的にシリアライザを一覧表示することができます。

class UnitSerializer(serializers.ModelSerializer): 
    unit_type = serializers.SlugRelatedField(
     queryset=UnitType.objects.all(), slug_field='description' 
    ) 
    unitholders = UnitHolderSerializer(many=True) 

    class Meta: 
     model = Unit 
     fields = ('unit_number', 'unit_type', 'unitholders') 

また、サイドノートとして、あなたはprefetch related objectsにビュー内のあなたのクエリセットを変更するに調べる必要があり、そうでない場合は、あなたを非常に迅速にアプリのパフォーマンスを破壊します(生成されたクエリを監視するためのdjango-debug-toolbarなどを使用すると便利です)。

class UnitViewSet(viewsets.ModelViewSet): 
    queryset = Unit.objects.all().select_related('unit_type').prefetch_related('unitholders') 
    serializer_class = UnitSerializer 
+0

ありがとうございました!これはすべて非常に役に立ちます。深さ= 1は私のために働いたがシリアライザを明示的にエラーでリストする。私は自分自身でそれらを処理しようとします:) – Progger

+0

"'unitholder_type': 'renter'"が返されていないことに気づきました。ユニットと人物を関連付ける結合テーブルに保持されています。私は、その人に関連付けられているユニットだけでなく、結合そのものに保持されている関連タイプも返したいと思います。 – Progger

関連する問題