Django rest framework serializando muchos a muchos campos

¿Cómo serializo un campo muchos a muchos en una lista de algo y los devuelvo a través del marco de descanso? En mi ejemplo a continuación, trato de devolver la publicación junto con una lista de tags asociadas a ella.

modelos.py

class post(models.Model): tag = models.ManyToManyField(Tag) text = models.CharField(max_length=100) 

serializers.py

 class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ("text", "tag"??) 

vistas.py

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

    Necesitará un TagSerializer , cuya class Meta tiene model = Tag . Después de TagSerializer , modifique el PostSerializer con many=True para una relación ManyToManyField :

     class PostSerializer(serializers.ModelSerializer): tag = TagSerializer(read_only=True, many=True) class Meta: ... 

    La respuesta es para DRF 3

    Esto es lo que hice, supongamos que un Libro puede tener más de un autor y un Autor puede tener más de un libro: En Modelo:

     class Author(models.Model): name = models.CharField(max_length=100, default="") last_name = models.IntegerField(default=0) class Book(models.Model): authors = models.ManyToManyField(Author, related_name="book_list", blank=True) name = models.CharField(max_length=100, default="") published = models.BooleanField(default=True) 

    En Serializadores:

     class BookSerializer(serializers.ModelSerializer): authors = serializers.PrimaryKeyRelatedField(queryset=Author.objects.all(), many=True) class Meta: model = Book fields = ('id', 'name', 'published', 'authors') class AuthorSerializer(serializers.ModelSerializer): book_list = BookSerializer(many=True, read_only=True) class Meta: model = Author fields = ('id', 'name', 'last_name', 'book_list') 

    En el serializador en el método init , puede pasar el queryset al campo y rest_framework validar los identificadores en ese queryset

    1) primero extienda su serializador de serializadores.ModelSerializer

     class YourSerializer(serializers.ModelSerializer): 

    2) incluir el campo en la meta clase

     class YourSerializer(serializers.ModelSerializer): class Meta: fields = (..., 'your_field',) 

    3) en el método init:

     def __init__(self, *args, **kwargs): super(YourSerializer, self).__init__(*args, **kwargs) self.fields['your_field].queryset =  

    Puede limitar el queryset para ese campo bajo cualquier argumento usando el filtro o la exclusión como lo hace normalmente. En caso de que quiera incluir todos, simplemente use .objects.all ()

    Django 2.0

    Para muchos a muchos campos, si quieres uno específico:

     class QuestionSerializer(serializers.ModelSerializer): topics_list = serializers.SerializerMethodField() def get_topics_list(self, instance): names = [] a = instance.topics.get_queryset() for i in a: names.append(i.desc) return names class Meta: model = Question fields = ('topics_list',) 

    Esto funciona para mi

     tag = TagSerializer(source="tag", read_only=True, many=True)