2013-06-24 11 views
33

के साथ एक विदेशी कुंजी मान पुनर्प्राप्त करना मैं एक एपीआई बनाने के लिए django आराम ढांचे का उपयोग कर रहा हूं।django-rest-framework serializers

class Category(models.Model): 
    name = models.CharField(max_length=100) 

    def __unicode__(self): 
     return self.name 


class Item(models.Model): 
    name = models.CharField(max_length=100) 
    category = models.ForeignKey(Category, related_name='items') 

    def __unicode__(self): 
     return self.name 

श्रेणियों के लिए एक serializer मुझे क्या करना चाहते हैं बनाने के लिए::

class CategorySerializer(serializers.ModelSerializer): 
    items = serializers.RelatedField(many=True) 

    class Meta: 
     model = Category 

... और यह मेरे साथ प्रदान करेगा:

[{'items': [u'Item 1', u'Item 2', u'Item 3'], u'id': 1, 'name': u'Cat 1'}, 
{'items': [u'Item 4', u'Item 5', u'Item 6'], u'id': 2, 'name': u'Cat 2'}, 
{'items': [u'Item 7', u'Item 8', u'Item 9'], u'id': 3, 'name': u'Cat 3'}] 

मैं निम्नलिखित मॉडल मैं एक आइटम धारावाहिक से रिवर्स प्राप्त करने के बारे में कैसे जाउंगा, यानी:

[{u'id': 1, 'name': 'Item 1', 'category_name': u'Cat 1'}, 
{u'id': 2, 'name': 'Item 2', 'category_name': u'Cat 1'}, 
{u'id': 3, 'name': 'Item 3', 'category_name': u'Cat 1'}, 
{u'id': 4, 'name': 'Item 4', 'category_name': u'Cat 2'}, 
{u'id': 5, 'name': 'Item 5', 'category_name': u'Cat 2'}, 
{u'id': 6, 'name': 'Item 6', 'category_name': u'Cat 2'}, 
{u'id': 7, 'name': 'Item 7', 'category_name': u'Cat 3'}, 
{u'id': 8, 'name': 'Item 8', 'category_name': u'Cat 3'}, 
{u'id': 9, 'name': 'Item 9', 'category_name': u'Cat 3'}] 

मैंने बाकी ढांचे के लिए reverse relationships पर दस्तावेज़ों के माध्यम से पढ़ा है लेकिन यह गैर-विपरीत क्षेत्रों के समान परिणाम प्रतीत होता है। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?

उत्तर

50

many=True सेट किए बिना बस संबंधित क्षेत्र का उपयोग करें।

ध्यान दें कि यह भी है क्योंकि आप उत्पादन category_name नामित चाहते हैं, लेकिन वास्तविक क्षेत्र category है, तो आप serializer मैदान पर source तर्क का उपयोग करने की आवश्यकता है।

निम्नलिखित आप उत्पादन की जरूरत है देना चाहिए ...

class ItemSerializer(serializers.ModelSerializer): 
    category_name = serializers.RelatedField(source='category', read_only=True) 

    class Meta: 
     model = Item 
     fields = ('id', 'name', 'category_name') 
+0

के लिए काम किया में आपको बहुत बहुत धन्यवाद टॉम – hellsgate

+15

किस बारे में वर्ग मॉडल के सभी क्षेत्रों को पुन: प्राप्त ?? – Clayton

+4

यदि आप श्रेणी मॉडल के सभी फ़ील्ड को पुनर्प्राप्त करना चाहते हैं तो श्रेणी क्रमबद्ध करें और इसे श्रेणी_नाम = श्रेणीसेरलिज़र() –

13

एक और बात आप कर सकते हैं करने के लिए है:

  • अपने Item मॉडल में एक संपत्ति है कि श्रेणी के नाम पर रिटर्न बना सकते हैं और
  • इसे ReadOnlyField के रूप में बेनकाब करें।

आपका मॉडल इस तरह दिखेगा।

class Item(models.Model): 
    name = models.CharField(max_length=100) 
    category = models.ForeignKey(Category, related_name='items') 

    def __unicode__(self): 
     return self.name 

    @property 
    def category_name(self): 
     return self.category.name 

आपका सीरियलाइज़र इस तरह दिखेगा। ध्यान दें कि serializer को उसी नाम के साथ फ़ील्ड नाम देकर स्वचालित रूप से category_name मॉडल प्रॉपर्टी का मान प्राप्त होगा।

class ItemSerializer(serializers.ModelSerializer): 
    category_name = serializers.ReadOnlyField() 

    class Meta: 
     model = Item 
+1

मैंने इस उद्देश्य के साथ उपयोग नहीं किया था। लेकिन मुझे '@ property' के उपयोग के बारे में पता नहीं था। तो, बहुत बहुत धन्यवाद। यह वास्तव में उपयोगी था। यह serializer में अन्य तत्व के साथ मेरी मदद करता है। – joseglego

16

वर्तमान डीआरएफ (3.6.3) संस्करण इस मुझे

class ItemSerializer(serializers.ModelSerializer): 
    category_name = serializers.CharField(source='category.name') 

    class Meta: 
     model = Item 
     fields = ('id', 'name', 'category_name') 
+0

एक जादू की तरह काम किया, धन्यवाद! – UserNotFoundException

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