2017-03-24 7 views
0

以下のモデルでは、Django REST Frameworkを使用して、私が気にしているデータ構造(以下も参照)を返す方法を見つけようとしています。DRF:シリアライザまたはビューのデータ構造ですか?

これはシリアライザ内でどのように達成されるのですか、伝統的なDjangoスタイルのクエリを使用してビュー内にそのようなデータ構造を構築する必要がありますか?

について

基本的には、単語が作成され、ユーザーはその単語の定義を提出し、各定義に投票(おかしな、悲しい、WTF、など)

models.py

クエリ結果の構造

期待
from django.db import models 


class Word(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    word = models.CharField() 
    timestamp = models.DateTimeField() 


class Definition(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    word = models.ForeignKey(Word, on_delete=models.CASCADE) 
    definition = models.CharField() 
    timestamp = models.DateTimeField() 


class Vote_category(models.Model): 
    category = models.CharField() 


class Vote_history(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    definition = models.ForeignKey(Definition, on_delete=models.CASCADE) 
    timestamp = models.DateTimeField() 
    vote = models.ForeignKey(Vote_category, on_delete=models.CASCADE) 

word: 'hello', definitions: [ { user: 'alice', definition: 'an expression of greeting', votes: { funny: 3, sad: 1, wtf: 7 }, votes_total: 11 }, etc... ] 

ありがとうございます!

+1

定義は 'dict'ではなく' list'でなければなりません。 –

+0

@Michael:良​​いキャッチ。私はこの例を更新しました。ありがとう。 –

答えて

1

あなたが付けたスキーマは、Django REST Frameworkシリアライザを使用して生成できます。ネストされたシリアライザを使用してスキーマのネストされた要素を生成できます。一般に、これらのシリアライザはModelSerializerから継承します。ここで

はあなたのスキーマを構築するために開始するために使用するネストされたシリアライザの例である:あなたがより複雑になる可能性が列挙されているスキーマの

class WordSerializer(serializers.ModelSerializer): 
    """Serializer for a Word""" 
    definitions = DefinitionSerializer(many=True) 

    class Meta: 
     model = Word 
     fields = ('word', 'definitions') 

class DefinitionSerializer(serializers.ModelSerializer): 
    """Serializer for a Definition""" 
    user = UserSerializer(read_only=True) 
    votes = VoteSerializer(many=True) 

    class Meta: 
     model = Word 
     fields = ('definition', 'user', 'votes') 

一部は投票に投票カテゴリのマップですカウント。 DRFは当然のことながら、あなたのスキーマが持つような単一のオブジェクトではなく、オブジェクトのリストである構造を作成します。その動作を無効にするには、creating a custom ListSerializerを調べることができます。

+0

ありがとう。実際、投票数と投票数のマップは最も複雑な部分です。それ以外は私が働いているすべて。ヘルプは歓迎されます。 –

+0

ひとつのJSON 'object'にエンコードされている必要がない場合は、それを' object'のリストとして表現することができます。これは一つのプロパティで投票のタイプを表します( 'funny'、' sad'など)カウントを表す別のプロパティそれが私のこの同じ問題に対する解決策でした。回答があなたの問題を解決した場合、あなたはそれを受け入れて、あなたの質問が答えられたことを他人に知らせることができます。それが役に立てば幸い! – natbob1

関連する問題