25

如何序列化一個多對多字段到某個列表中,並通過rest框架返回它們?在下面的示例中,我嘗試將帖子和與其關聯的標籤列表一起返回。Django rest框架序列化到多個領域

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

使用來自@Brian的幫助我設法列出這種形式的項目:「標籤」:[{「name」:「tag1」}]。 我想簡化它的列表,是否有可能:「tags」:[「tag1」,「tag2」,...] – kengcc

+0

使用'tags = serializers.SlugRelatedField(many = True,read_only = True, slug_field ='標題',//標籤的火焰想要顯示 allow_null = True)'在PostSerializers –

回答

31

您將需要一個TagSerializer,其class Metamodel = Tag。創建TagSerializer後,修改PostSerializermany=TrueManyToManyField關係:

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

    class Meta: 
     ... 

Answer is for DRF 3

+0

它工作! :D 任何想法如何將這個序列化程序變成逗號分隔列表? 類TagSerializer(serializers.ModelSerializer): 類元: 模型=標籤 欄=( '名') – kengcc

+1

現在,我得到: 「標籤」:[{ 「Name」: 「標籤1」}] 我想簡化爲:「tags」:[「tag1」,「tag2」,...] – kengcc

+0

tags = serializers.ListField(source ='tag')。這將爲您提供標籤的每個對象的__str__表示列表 –

1

這對我的作品。

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

在上INIT方法串行器,你可以通過查詢集到外地rest_framework的Valide的ID上查詢集

1)首先從serializers.ModelSerializer

class YourSerializer(serializers.ModelSerializer): 
擴展您的序列化

2)包括元類上的字段

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

3)在init方法:

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

可以使用過濾器限制任何參數下該字段的查詢集或排除像通常你做。如果你想包括所有隻使用.objects.all()

相關問題