2016-08-03 1 views
1

を入れ子にしているオブジェクトを作成し、私のstore_categories_dataががorderDict

store_categories_data 
OrderedDict([('product', OrderedDict([('image', OrderedDict([('image', <InMemoryUploadedFile: bag.jpg (image/jpeg)>)])), 
('name_of_product', 'Ladies Pink Bag'), ('description', 'description'), ('price', Decimal('1600')), ('active', True)])), 
('store_category', 'BAGS')]) 

以下のようなネストされたorderDictを持っている私は画像、名前、説明などのようなすべての製品情報を渡したい。しかし3 orderDictがあります。 store_categoriesオブジェクトを作成するためにget_or_create()に値を渡すにはどうすればよいですか?

私のコード

class ProductSerializers(ModelSerializer): 
    image = ProductImageSerializer() 
    class Meta: 
     model = Product 
     fields=('id','image','name_of_product','description','price','active',) 

class StoreCategorySerializer(ModelSerializer): 
    product = ProductSerializers() 
    class Meta: 
     model = StoreCategory 

class StoreCreateSerializer(ModelSerializer): 
    store_categories = StoreCategorySerializer() 
    merchant = UserSerializer() 
    class Meta: 
     model = Store 
     fields=("id", 
       "merchant", 
       "store_categories", 
       "name_of_legal_entity", 
       "pan_number", 
       "registered_office_address", 
       "name_of_store", 
       "store_contact_number", 
       "store_long", 
       "store_lat", 
       "store_start_time", 
       "store_end_time", 
       "store_off_day", 
       ) 
    def create(self,validated_data): 
     store_categories_data = validated_data.pop('store_categories') 
     merchant_data = validated_data.pop('merchant') 
     for merchantKey, merchantVal in merchant_data.items(): 
      try: 
       merchant,created = User.objects.get_or_create(username=merchantVal) 
       print('merchant',merchant) 
       print(type(merchant)) 
       validated_data['merchant']=merchant 
       store = Store.objects.create(**validated_data) 
       print('__________________________________') 
       image = store_categories_data["product"].pop("image") 
       image_instance = ProductImage(**image) 
       print('image_instance',image_instance) 
       product = store_categories_data["product"] 
       print('product creation returns',product['name_of_product']) 
       product_instance = Product(
              image=image_instance, 
              name_of_product=product['name_of_product'], 
              description=product['description'], 
              price=product['price'], 
              active=product['active'] 
             ) 
       print('product_instance',product_instance) 
       store_category = store_categories_data['store_category'] 
       print('store_category',store_category) 
       store_category = StoreCategory(product=product_instance, store_category=store_category) 
       print('store category instance',store_category) 
       return store 
      except User.DoesNotExist: 
       raise NotFound('not found') 

Models.py

class Store(models.Model): 
    merchant = models.ForeignKey(User) 
    name_of_legal_entity = models.CharField(max_length=250) 
    pan_number = models.CharField(max_length=20) 
    registered_office_address = models.CharField(max_length=200) 
    name_of_store = models.CharField(max_length=100) 
    store_off_day = MultiSelectField(choices=DAY, max_length=7, default='Sat') 
    store_categories = models.ManyToManyField('StoreCategory',blank=True) 

class Product(models.Model): 
    store = models.ForeignKey(Store) 
    image = models.ForeignKey('ProductImage',blank=True,null=True) 
    name_of_product = models.CharField(max_length=120) 
    description = models.TextField(blank=True, null=True) 
    price = models.DecimalField(decimal_places=2, max_digits=20) 
    active = models.BooleanField(default=True) 

class ProductImage(models.Model): 
    image = models.ImageField(upload_to='products/images/') 

    @property 
    def imageName(self): 
     return str(os.path.basename(self.image.name)) 


class StoreCategory(models.Model): 
    product = models.ForeignKey(Product,null=True, on_delete=models.CASCADE,related_name="store_category") 
    store_category = models.CharField(choices=STORE_CATEGORIES, default='GROCERY', max_length=10) 

答えて

0

リレーショナルデータベース内の外部キー関係にごOrderedDictマップで営巣を想定して、あなただけ明示的にすべて作成する必要があります3つのレコードが順番に、内側から順に。以下のようなものは、残りの部分を運ぶのに十分なはずです。

注:**のキーワードargsにdictsを展開すると、より新しいバージョンのPython> = Python3.5にしか動作しません。

image = store_categories_data["product"].pop("image") 
image_instance = Image(**image) 
product = store_categories_data["product"] 
product_instance = Product(image=image_instance, product=product) 
store_category = store_categories_data['store_category'] 
store_category = StoreCategory(product=product_instance, store_category=store_category) 
+0

このエラーが発生します。TypeError: 'product'は、この関数の無効なキーワード引数です。 product_instance = Product(image = image_instance、product = product) – milan

+0

提供したコードでコードを更新しました。シリアライザ 'StoreCategorySerializer'で' product'フィールドの値を取得しようとすると、エラー 'Got AttributeErrorが発生しました。 シリアライザフィールドの名前が誤っていて、 'ManyRelatedManager'インスタンスの属性またはキーと一致しない可能性があります。 元の例外テキストは 'ManyRelatedManager'オブジェクトに 'product'属性がありませんでした。投稿しようとしている間。 – milan

+0

上記のエラーのためカテゴリと製品はデータベースに保存されません。 – milan