25

के लिए कई मैं कुछ की सूची में एक बहुत-से-अनेक क्षेत्र कैसे को क्रमानुसार है, और बाकी ढांचे के माध्यम से उन्हें वापस जाने? नीचे दिए गए मेरे उदाहरण में, मैं इसके साथ जुड़े टैग की एक सूची के साथ पोस्ट को वापस करने का प्रयास करता हूं।Django बाकी ढांचे serializing कई क्षेत्र

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

का उपयोग मदद शामिल चाहते हैं मैं इस रूप में आइटम सूचीबद्ध करने का प्रबंधन। मैं इसे सूची में सरल बनाना चाहता हूं, क्या यह संभव है: "टैग": ["टैग 1", "टैग 2", ...] – kengcc

+0

'टैग = serializers.SlugRelatedField का उपयोग करें (कई = सही, read_only = True, slug_field = 'शीर्षक', // टैग की fireld आप PostSerializers –

उत्तर

31

आप एककी आवश्यकता होगी, जिसका class Metamodel = Tag है।

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

    class Meta: 
     ... 

Answer is for DRF 3

+0

यह काम करता है में allow_null = सच दिखाने के लिए) 'चाहते !!! : डी कोई विचार है कि इस धारावाहिक को केवल अल्पविराम से अलग सूची में कैसे बदला जाए? वर्ग TagSerializer (serializers.ModelSerializer): वर्ग मेटा: मॉडल = टैग क्षेत्रों = ('नाम') – kengcc

+1

अभी, मैं मिलता है: "टैग": [{ "नाम": "tag1"}] मैं इसे सरल बनाना चाहता हूं: "टैग": ["टैग 1", "टैग 2", ...] – kengcc

+0

टैग = serializers.ListField (स्रोत = 'टैग')। यह आपको टैग –

1

यह मेरे लिए काम करता है: TagSerializer बनाने के बाद, एक ManyToManyField संबंध के लिए many=True साथ PostSerializer संशोधित करते हैं।

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

init पद्धति पर serializer में आप पहले serializers.ModelSerializer

से
class YourSerializer(serializers.ModelSerializer): 
अपने serializer का विस्तार है कि क्वेरीसमूह

1) पर क्षेत्र और rest_framework valide आईडी को क्वेरीसमूह पारित कर सकते हैं

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> 

आप फिल्टर का उपयोग कर किसी भी तर्क के तहत है कि क्षेत्र के लिए क्वेरीसमूह को सीमित या की तरह सामान्य रूप से आप कर बाहर कर सकते हैं। "टैग":: [{ "नाम": "tag1"}] मामले कि आप @Brian से सब सिर्फ .objects.all का उपयोग()

संबंधित मुद्दे