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