2015-01-22 9 views
9

पोस्ट करने के लिए कैसे दो मॉडल हैं: Product और Picture। प्रत्येक Product में कई Picture एस हो सकते हैं। मेरे पास प्रश्न हैं जब मैं POST का उपयोग कर उत्पाद बनाना चाहता हूं। एक ImageField सूची युक्त एक नेस्टेड ऑब्जेक्ट को कैसे पोस्ट करें?एक नेस्टेड डेटा और छवि की सूची

Product मॉडल है:

class Product(models.Model): 
    product_id = models.AutoField(primary_key=True) 
    product_name = models.CharField(max_length=50) 
    description = models.TextField(blank=True) 

Picture मॉडल है:

class Picture(models.Model): 
    product = models.ForeignKey(Product, related_name='pictures') 
    path = models.ImageField(null=False, upload_to='product_pic') 
    description = models.CharField(max_length=255, null=True, blank=True) 
    main = models.BooleanField() 

मैं पालन serializer.py लिखें:

class PictureSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Picture 
     fields = ('path', 'description', 'main') 

class ProductSerializer(serializers.ModelSerializer): 
    pictures = PictureSerializer(many=True, required=False) 

    class Meta: 
     model = Product 
     fields = ('product_id', 'product_name', 'pictures', 'description') 

राय यह है कि मैं उपयोग कर रहा हूँ है:

class ProductEnum(generics.ListCreateAPIView): 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer 
    permission_classes = (IsAuthenticated,) 

    def post(self, request, format=None): 
     serializer = ProductSerializer(data=request.DATA, files=request.FILES) 

     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

मैं के रूप में यूआरएल में पंजीकृत कर रहा हूँ:

url(r'^api/products/$', views.ProductEnum.as_view()), 

प्रश्न हैं:

  • मैं कैसे परीक्षण कर सकते हैं django-rest-framework के रूप में इस पोस्ट एपीआई मुझसे कहता है कि "सूचियाँ वर्तमान में समर्थित नहीं हैं एचटीएमएल इनपुट "
  • एकाधिक Pictures के साथ Product संसाधनों को पोस्ट करने के लिए JSON का उपयोग कैसे करें। या मुझे मल्टीपार्ट पार्सर का उपयोग करना होगा।
  • curl कमांड कैसे लिखें?
+1

क्या आपने इसे सही करने के लिए प्रबंधित किया था? – momokjaaaaa

उत्तर

0

आप manage.py shell का उपयोग कर सकते हैं। इस तरह:

import requests 
r = requests.post("http://localhost:8000/login/url", data={"username": "username", "password": "password"} 
r.content (outputs token) 
token="yourtoken" 
r = requests.post("http://localhost:8000/your/url", data={your POST data in json}, headers={"Authorization": "Token %s" % token}) 
+0

आपने पोस्टर के सुनहरे प्रश्न का उत्तर नहीं दिया - एकाधिक चित्रों के साथ उत्पाद संसाधन पोस्ट करने के लिए JSON का उपयोग कैसे करें। या मुझे मल्टीपार्ट पार्सर का उपयोग करना होगा। – momokjaaaaa

0

डीआरएफ यह काफी करना आसान बनाता है। डॉक्स में

class ProductSerializer(serializers.ModelSerializer): 
    pictures = PictureSerializer(many=True, required=False) 

    class Meta: 
     model = Product 
     fields = ('product_id', 'product_name', 'pictures', 'description') 

    def create(self, validated_data): 
     # Pop this from the validated_data first, since the serializer can't handle it. 
     pictures = validated_data.pop('pictures') 
     product = super().create(validated_data) 
     # Now that we have a product to reference in the FKey, create the pictures. 
     for picture in pictures: 
      # `picture` has been run through the PictureSerialzer, so it's valid. 
      picture['product'] = product 
      Picture.objects.create(**picture) 
     return product 

एक पूर्ण उदाहरण नहीं है, यहाँ:: आप कर रहे हैं करीब है, आप ProductSerializer.create ओवरराइड करने के लिए, कुछ इस तरह की जरूरत है http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers

अपने curl आदेश के लिए, यह होने वाला है कुछ की तरह:

curl -X POST http://localhost:8000/products/ -H 'ContentType: application/json' -d '{"pictures": [{"description": "first one"}, {"description": "second one"}], "product_name": "foobar"}'

2

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

  1. अपने बाकी दृष्टिकोण को कमजोर और एक अपवाद बनाने -> json को रोक नहीं सकते बाइनरी डेटा
  2. एनकोड बेस 64 के साथ हर बाइनरी फ़ाइल, json दृष्टिकोण रखते हैं लेकिन आप हर अनुरोध के लिए अतिरिक्त डी/एन्कोडिंग करने की जरूरत है (मूल रूप से समर्थित नहीं)

एक दृष्टिकोण है कि अक्सर देखा जा सकता है एक (गैर बाकी) जो File या Document वस्तुओं (अपलोड पर एक आईडी लौटने) बनाने के एकल/एकाधिक फ़ाइलों को अपलोड करने के लिए दृश्य बनाने के लिए है। फिर आप इन आईडी (ओं) का उपयोग कर सकते हैं, जो आपके मामले में आपके Product को बना/अपडेट कर रहे हैं।

सामान्यतः ऐसा करने का कोई आसान तरीका नहीं है क्योंकि जेसन बाइनरी डेटा का समर्थन नहीं करता है।

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