25

Jak serializować wiele z wielu pól na liście czegoś i zwracać je przez strukturę odpoczynku? W poniższym przykładzie staram się zwrócić wpis wraz z listą powiązanych z nim tagów.Django reszta ramy serializowanie wielu do wielu pól

models.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 
+0

Korzystając z pomocy @Briana, mogę wyświetlić listę pozycji w tym formularzu: "tags": [{"name": "tag1"}]. Chciałbym uprościć go do listy, czy jest to możliwe: "tags": ["tag1", "tag2", ...] – kengcc

+0

użyć 'tags = serializers.SlugRelatedField (many = True, read_only = True, slug_field = 'title', // tag fireld chcesz pokazać allow_null = True) w postSerializers –

Odpowiedz

31

Musisz TagSerializer, którego class Meta ma model = Tag. Po TagSerializer jest tworzony, należy zmodyfikować PostSerializer z many=True dla ManyToManyField zależnością:

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

    class Meta: 
     ... 

Answer is for DRF 3

+0

to działa !!! : D Każdy pomysł, jak zmienić ten serializator na listę oddzieloną przecinkami? klasa TagSerializer (serializers.ModelSerializer): class Meta: Model = Tag pola = ('name') – kengcc

+1

Teraz otrzymuję: "tagi": [{ "name": "tag1"}] Chciałbym go uprościć do "tagów": ["tag1", "tag2", ...] – kengcc

+0

tags = serializers.ListField (source = 'tag'). Spowoduje to wyświetlenie listy reprezentacji __str__ każdego obiektu znacznika. –

1

Działa to dla mnie.

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

W serializatora na startowych metodzie można przejść do pola queryset i rest_framework valide identyfikatorów tego queryset

1) najpierw przedłużyć serializatora od serializers.ModelSerializer

class YourSerializer(serializers.ModelSerializer): 

2) obejmują pole w klasie meta

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

3) w metodzie Init:

def __init__(self, *args, **kwargs): 
    super(YourSerializer, self).__init__(*args, **kwargs) 
    self.fields['your_field].queryset = <the queryset of your field> 

Można ograniczyć queryset dla tej dziedzinie na podstawie jakiegokolwiek argumentu za pomocą filtru lub wykluczyć jak zwykle robisz. W przypadku, gdy chcesz, możesz użyć tylko .objects.all()