2015-01-22 13 views
9

İki model vardır: Product ve Picture. Her Product, birçok Picture s ürününe sahip olabilir. POST kullanarak bir Ürün oluşturmak istediğimde sorularım var. Bir ImageField listesi içeren yuvalanmış bir nesneyi POST nasıl?İç içe geçmiş bir veriyi ve görüntü listesini nasıl gönderilir?

Product modelidir:

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

Picture modelidir:

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() 

ben aşağıdaki gibi serializer.py yazın:

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') 

kullanıyorum görünüm :

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) 
Ben URL'ler ortamında kayıt am

:

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

sorular şunlardır:

  • nasıl django-rest-framework olarak bu POST API Listeleri şu anda desteklenmemektedir" söylüyor test edebilir HTML girişi "
  • Birden çok Pictures ile Product POST için kaynak JSON nasıl kullanılır. VEYA multipart ayrıştırıcı kullanmalıyım.
  • cURL komutu nasıl yazılır?
+1

Doğru almayı başardınız mı? – momokjaaaaa

cevap

0

manage.py kabuğunu kullanabilirsiniz. Bunun gibi :

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

Posterin altın sorusunu yanıtlamadınız - Birden çok Resimle Ürün kaynaklarını POST yapmak için JSON nasıl kullanılır? VEYA multipart ayrıştırıcı kullanmalıyım. – momokjaaaaa

0

DRF yapmak için bu oldukça kolaylaştırır. Tam bir örnek var

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 

docs, burada: Sen, sen, ProductSerializer.create geçersiz kılmak için böyle bir şey yakın ihtiyacımız vardır http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers

sizin curl komutu için, olacak gibi bir şey:

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

2

gelir gelmez temelde sadece seçimler zorunda ikili veri göndermek gerekir gibi çok parçalı ayrıştırıcı kullanmak zorunda:

  1. sizin DİNLENME yaklaşımı zayıflatmak ve bir istisna yapmak -> json tutamayacak ikili veri
  2. kodlamak base64 ile her ikili dosya, json yaklaşımı tutmak ama her istek için ek de/kodlama yapmak gerekir (doğal olarak desteklenmez)

oldukça sık görülebilir bir yaklaşım (yükleme üzerinde kimliği dönen) File veya Document nesneler yaratmak tek/birden fazla dosya yüklemek için bir (non dinlenme) görünümü yaratmaktır. Daha sonra, Product'unuzu oluştururken/güncellediğinizde, bu id (lar) ı başka bir istekte kullanabilirsiniz.

Genelde json ikili verileri desteklemediği için bunu yapmanın kolay bir yolu yoktur.