tutorial instalar python django django-models django-rest-framework django-serializer

python - instalar - install django windows



Django rest framework serializando muchos campos (5)

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

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"??)

views.py

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


Django 2.0

Para muchos a muchos campos, si desea 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'',)


En el serializador en el método init , puede pasar el conjunto de consultas al campo y rest_framework valida los identificadores en ese conjunto de consultas

1) primero extienda su serializador de serializadores.

class YourSerializer(serializers.ModelSerializer):

2) incluye el campo en la metaclase

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 = <the queryset of your field>

Puede limitar el conjunto de consultas para ese campo bajo cualquier argumento usando filtro o excluir como lo hace normalmente. En caso de que desee incluir todo, solo use .objects.all ()


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 el 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'')


Esto funciona para mi.

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


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