2016-12-22 5 views
1

Я осмотрел, и я не нашел ответа на этот вопрос.Django REST framework - Получение данных вместо ссылок

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?

ответ

2

Чтобы раскрыть все соответствующие данные на один уровень вы можете использовать depth параметров:

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

Это заменит post.user и post.comments идентификаторы с реальными записями. depth=2 также разворачивается post.comments.user. Если вы хотите, чтобы выборочно тянуть post.comments только один уровень и не post.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'] 

Если на вершине вы хотите иметь post.comments.user развернутые, необходимо либо поместить depth=1 в существующий комментарии сериализатор или создать новый сериалайзер с развернутыми пользователями только для этой точки зрения, аналогично приведенным выше примерам.

Также убедитесь, что вы используете prefetch_related на вашем QuerySet или производительность будет принимать серьезный удар, как:

Post.objects.all().prefetch_related('comments', 'comments__user') 
Смежные вопросы