2016-12-22 10 views
1

私は周りを見て、私はこの質問への答えを見つけることができませんでした。Django RESTフレームワーク - リンクの代わりにデータを取得する

Serializers.py

class PostSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Post 
     fields = ['title', 'body', 'comments', 'user', 'date'] 

class CommentSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Comment 
     fields = ['body', 'user', 'date'] 

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = User 
     fields = ['id', 'user'] 

Models.py

class Post(models.Model): 
    # Children 
    comments = models.ManyToManyField('Comment', blank=True) 

    # Content 
    title = models.TextField(default="-->Title here<--") 
    body = models.TextField(default="-->Body here<--") 

    # About 
    user = models.ForeignKey(User) 
    date = models.DateTimeField(auto_now=True) 


    object_id = models.PositiveIntegerField(default=0) 
    content_type = models.ForeignKey(ContentType, default=0) 
    content_object = fields.GenericForeignKey() 

    def __str__(self):    
     return str(self.title) 


class Comment(models.Model): 
    comments = models.ManyToManyField('Comment', blank=True) 

    # Content 
    body = models.TextField(default="-->Body here<--") 

    # About 
    user = models.ForeignKey(User) 
    date = models.DateTimeField(auto_now=True) 

    object_id = models.PositiveIntegerField(default=0) 
    content_type = models.ForeignKey(ContentType, default=0) 
    content_object = fields.GenericForeignKey() 

    def __str__(self):    
     return str(self.body) 

Views.py

class PostViewSet(viewsets.ModelViewSet): 
    queryset = Post.objects.all() 
    serializer_class = PostSerializer 


class CommentViewSet(viewsets.ModelViewSet): 
    queryset = Comment.objects.all() 
    serializer_class = CommentSerializer 


class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 


def index(request): 
    return render(request, 'index.html', []) 

インデックス・テンプレートは、最新の投稿をロードする "ホームページ" です。各投稿の下で、私はコメントを表示しています。 JSONではこれらのリンクがあり、リンクをどのようにロードするのかがわかりました。

誰かが、このようにするのではなく、バックエンドのコメントを「読み込む」ようにして、投稿(データでもリンクでもない)と一緒に送るべきだと言いました。彼は私に次のことを尋ねた:http://www.django-rest-framework.org/api-guide/filtering/#overriding-the-initial-queryset

私は本当にそれを理解することはできません。

ManyToManyFieldのリンクのデータを取得するにはどうすればよいですか?

class PostSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Post 
     fields = ['title', 'body', 'comments', 'user', 'date'] 
     depth = 1 

これは、実際のレコードを持つpost.userpost.commentsのIDを交換します:あなたはdepthのparamを使用することができ、すべての関連データを1つのレベルの深さを展開する

答えて

2

depth=2も展開しますpost.comments.user。あなたが選択的に深いpost.comments一つだけのレベルを引きたくないpost.user場合:あなたは、post.comments.userが折り畳まれていないがしたい

class PostSerializer(serializers.HyperlinkedModelSerializer): 
    comments = CommentSerializer(many=True) #has to be declared higher above 
    class Meta: 
     model = Post 
     fields = ['title', 'body', 'comments', 'user', 'date'] 

上にした場合のいずれかの既存のコメントシリアライザにdepth=1を入れたり、折り畳まれていないユーザーとの新しいシリアライザを作成する必要があるだけでこのビューでは、上記の例と同様です。また

のように、あなたはあなたのクエリセットにprefetch_relatedを使用しているか、パフォーマンスが深刻な打撃を受けるだろうことを確認してください。

Post.objects.all().prefetch_related('comments', 'comments__user') 
関連する問題