2014-12-31 8 views
8

मैं Django Rest Framework 3.0 का उपयोग करके घोंसले संबंध बनाने का प्रयास कर रहा हूं। मैंने अपने सीरियललाइज़र बनाए हैं और create() फ़ंक्शन को ओवरराइड करने का प्रयास किया है।Django Rest Framework 3.0: नेस्टेड सेविंग, कई से एक रिलेशनशिप

class Item(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    name = models.CharField(max_length=200) 
    description = models.CharField(max_length=1000) 
    categories = models.ManyToManyField(Category, null=True, blank=True) 

class Price(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    item = models.ForeignKey(Item, related_name='prices') 
    name = models.CharField(max_length=100) 
    cost = models.FloatField() 

आप ध्यान दें हूँ के रूप में, मैं अपने आइटम के लिए एक से अधिक मूल्य हो सकते हैं: मेरे मॉडल इस प्रकार के रूप में परिभाषित कर रहे हैं।

class PriceSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Price 
     owner = serializers.Field(source='owner.username') 
     exclude = ('user',) 

class ItemSerializer(serializers.ModelSerializer): 
    prices = PriceSerializer(many=True, required=False) 
    categories = CategorySerializer(many=True, required=False) 

    class Meta: 
     model = Item 
     owner = serializers.Field(source='owner.username') 
     fields = ('id', 'name', 'description', 'prices', 'categories') 

    def create(self, validated_data): 
     user = validated_data.get('user') 

     # Get our categories 
     category_data = validated_data.pop('categories') 

     # Create our item 
     item = Item.objects.create(**validated_data) 

     # Process the categories. We create any new categories, or return the ID of existing 
     # categories. 
     for category in category_data: 
      category['name'] = category['name'].title() 
      category, created = Category.objects.get_or_create(user=user, **category) 
      item.categories.add(category.id) 

     item.save() 

     return item 

जब मैं कोशिश करते हैं और पोस्ट एक नए आइटम:

{ 
    "name": "Testing", 
    "description": "This is a test", 
    "categories": [ 
     { 
      "name": "foo" 
     }, 
     { 
      "name": "bar" 
     } 
    ], 
    "prices": [ 
     { 
      "name": "Red", 
      "cost": 10 
     } 
    ] 
} 

मैं निम्नलिखित त्रुटि मिलती है:

{ 
    "prices": [ 
     { 
      "item": [ 
       "This field is required." 
      ] 
     } 
    ] 
} 

मुमकिन है क्योंकि मूल्य serializer नहीं है मेरे serializers इस प्रकार परिभाषित कर रहे हैं विचार करें कि नई वस्तु की आईडी क्या है। मैंने अपने serializer के create() फ़ंक्शन में इस कार्यक्षमता को ओवरराइड करने का प्रयास किया है, लेकिन ऐसा लगता है कि मेरे पास आइटम बनाने और इसे मूल्य के साथ संबद्ध करने का अवसर होने से पहले सीरिएलाइज़र की सत्यापन को हिट किया जा रहा है।

तो - मैं एक नया आइटम कैसे बना सकता हूं, आइटम आईडी प्राप्त कर सकता हूं, और फिर प्रत्येक नई कीमतें कैसे बना सकता हूं?

+0

क्या आप अपना डेटा पोस्ट करते समय भी 'निर्माण' विधि तक पहुंचते हैं? –

+0

@SimonCharette ऊपर पोस्ट किए गए कोड के साथ, नहीं, ऐसा नहीं लगता है कि मैंने कभी भी 'create' फ़ंक्शन दबाया है। हालांकि, अगर मैं आवश्यकतानुसार कीमत को चिह्नित नहीं करता हूं और JSON में इसे पोस्ट नहीं करता हूं, तो निर्माण फ़ंक्शन को ठीक से निष्पादित किया जाता है। इससे मुझे विश्वास होता है कि मेरे पास इसे संभालने का अवसर होने से पहले डेटा पर सत्यापन कहा जा रहा है। मैंने प्रमाणीकरण फ़ंक्शन को ओवरराइट करने का प्रयास नहीं किया ... – Julio

+1

क्या आप 'श्रेणीसेरियलाइज़र' के लिए कोड पेस्ट कर सकते हैं। –

उत्तर

5

समस्या यह है कि आपकी PriceSerializeritem कुंजी की तलाश में है क्योंकि यह Price मॉडल पर निर्दिष्ट है। यह तुरंत स्पष्ट नहीं है क्योंकि आप Meta.fields के बजाय Meta.exclude का उपयोग कर रहे हैं।

class PriceSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Price 
     exclude = ('user',) 

class PriceSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Price 
     fields = ('id', 'item', 'name', 'cost',) 

लेखन कौन सा यह बहुत स्पष्ट करता है आपकी समस्या के रूप में एक ही है। चूंकि मॉडल पर आपके item फ़ील्ड में empty=True (या null=True) सेट नहीं है, तो required=True के साथ Django REST Framework स्वचालित रूप से generates it as a PrimaryKeyRelatedField सेट करें। यही कारण है कि आप This field is required प्राप्त कर रहे हैं त्रुटि की आवश्यकता है, क्योंकि Django REST Framework स्वचालित रूप से यह नहीं पता लगा सकता है कि यह एक अभिभावक धारावाहिक से आ रहा है जिसमें पहले से ही वह फ़ील्ड है।

आप धारावाहिक से फ़ील्ड को हटाकर इसे प्राप्त कर सकते हैं, क्योंकि इसकी आवश्यकता कभी नहीं होती है।

class PriceSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Price 
     fields = ('id', 'name', 'cost',) 

यह नहीं रह गया item क्षेत्र प्रदर्शित करेगा, हालांकि, लेकिन मुझे लगता है यह वास्तव में आप के लिए कोई मुद्दा नहीं है।

+0

यूप, यह काम करता है! नेस्टेड धारावाहिक कैसे काम करेगा इस बारे में मेरे हिस्से पर एक गलतफहमी। – Julio

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