2016-07-01 7 views
2

マイmodels.pyジャンゴ-tastypie:関連データが

class Orders(models.Model): 
    order_id = models.CharField(max_length=7, primary_key=True) 
    users = models.ForeignKey(ProductUsers, on_delete=models.DO_NOTHING) 
    address = models.ForeignKey(ProductUsersAddress, on_delete=models.DO_NOTHING) 
    payment_method = models.CharField(default='COD', max_length=20, choices=PAYMENT_METHOD) 

class OrderedProduct(models.Model): 
    products = models.ForeignKey(Products, on_delete=models.DO_NOTHING) 
    orders = models.ForeignKey(Orders, on_delete=models.CASCADE) 
    quantity = models.IntegerField(default=0) 
    price = models.DecimalField(default=0.00, max_digits=5, decimal_places=2, blank=False) 

マイresources.py

class OrdersResource(ModelResource): 

    ordered_products = fields.ToManyField('orders.resources.OrderedProductResource', 
              attribute=lambda bundle: OrderedProduct.objects.filter(orders=bundle.obj), 
              related_name='orders', full=True, null=True) 

    contact_no = fields.ForeignKey(ProductUsersResource, 'users') 
    address = fields.ForeignKey(ProductUsersAddressResource, 'address') 

    class Meta: 
     queryset = Orders.objects.all() 
     resource_name = 'orders' 
     include_resource_uri = False 
     collection_name = 'orders' 
     allowed_methods = ['get', 'post'] 
     always_return_data = True 

class OrderedProductResource(ModelResource): 
    products = fields.ForeignKey(ProductsResource, 'products') 
    orders = fields.ForeignKey(OrdersResource, 'orders') 

    class Meta: 
     queryset = OrderedProduct.objects.all() 
     resource_name = 'ordered_products' 
     excludes = ['id'] 
     include_resource_uri = False 

を保存していない私は、Djangoの-Admin]を使用してデータを入力します。 私がヒット、http://localhost:8000/orders/、私が得る、

{ 
    "orders": [ 
    { 
     "address": "/api/v1/address/1", 
     "contact_no": "/api/v1/users/8269661606", 
     "order_id": "KJLSWI", 
     "ordered_products": [ 
     { 
      "orders": "/api/v1/orders/KJLSWI", 
      "price": "40.00", 
      "products": "/api/v1/products/1", 
      "quantity": 2 
     }, 
     { 
      "orders": "/api/v1/orders/KJLSWI", 
      "price": "70.00", 
      "products": "/api/v1/products/2", 
      "quantity": 4 
     }, 
     { 
      "orders": "/api/v1/orders/KJLSWI", 
      "price": "67.00", 
      "products": "/api/v1/products/3", 
      "quantity": 7 
     } 
     ], 
     "payment_method": "COD", 
    } 
    ] 
} 

今すぐおいしいマニュアルに従って、

Tastypieは、次のことができるようにする必要があり が得ることができるデータを意味し、「ラウンドtrippable」データを奨励POST/PUTして同じ オブジェクトを再作成してください。 送信する内容について質問がある場合は、 の別のオブジェクト&でGETを実行して、Tastypieがどのように見えるかを確認してください。

しかし、私はちょうど主キーを変更することで、同じデータを投稿、

{ 
    "address": "/api/v1/address/1", 
    "contact_no": "/api/v1/users/8269661606", 
    "order_id": "ABCDE", 
    "ordered_products": [ 
    { 
     "orders": "/api/v1/orders/ABCDE", 
     "price": "40.00", 
     "products": "/api/v1/products/1", 
     "quantity": 2 
    }, 
    { 
     "orders": "/api/v1/orders/ABCDE", 
     "price": "70.00", 
     "products": "/api/v1/products/2", 
     "quantity": 4 
    }, 
    { 
     "orders": "/api/v1/orders/ABCDE", 
     "price": "67.00", 
     "products": "/api/v1/products/3", 
     "quantity": 7 
    } 
    ], 
    "payment_method": "COD", 
} 

私はモデルOrderedProduct

{ 
    "address": "/api/v1/address/1", 
    "contact_no": "/api/v1/users/8269661606", 
    "ordered_products": [], 
    "payment_method": "COD", 
} 

マイデータ、応答を取得し、救われていません。 WHYYYYYYY ??????

def hydrate_m2m(self, bundle): 
    for ordered_product in bundle.data['ordered_products']: 
     if isinstance(ordered_product, dict): 
      ordered_product.update({'orders': bundle.obj}) 

    return super(OrdersResource, self).hydrate_m2m(bundle) 

をしてordered_products JSON

からordersキーを削除し、orders

attribute=lambda bundle: OrderedProduct.objects.filter(orders=bundle.obj)を交換し、モデル化するためにリソースからrelated_name='orders'を移動:

+0

はあなたが前に、すべてのオブジェクトのためのDjangoのシェルとクエリに確認しましたあなたの投稿の後に?あなたは何を見ますか? –

+0

@ShangWangはい、私は行いました。データは 'Orders'テーブルに保存されますが、 'OrderedProduct'では保存されません。 – itsji10dra

+0

http://stackoverflow.com/questions/11760973/posting-data-to-create-related-tastypie-resources-simultaneously –

答えて

1

これを試してみてください。最後に

モデル:

class OrderedProduct(models.Model): 
    products = models.ForeignKey(Products, on_delete=models.DO_NOTHING) 
    orders = models.ForeignKey(Orders, on_delete=models.CASCADE, related_name='orders') 
    quantity = models.IntegerField(default=0) 
    price = models.DecimalField(default=0.00, max_digits=5, decimal_places=2, blank=False) 

リソース:

class OrdersResource(ModelResource): 

    ordered_products = fields.ToManyField('orders.resources.OrderedProductResource', 
              'orders', full=True, null=True) 

    contact_no = fields.ForeignKey(ProductUsersResource, 'users') 
    address = fields.ForeignKey(ProductUsersAddressResource, 'address') 

    class Meta: 
     queryset = Orders.objects.all() 
     resource_name = 'orders' 
     include_resource_uri = False 
     collection_name = 'orders' 
     allowed_methods = ['get', 'post'] 
     always_return_data = True 

    def hydrate_m2m(self, bundle): 
     for ordered_product in bundle.data['ordered_products']: 
      if isinstance(ordered_product, dict): 
       ordered_product.update({'orders': bundle.obj}) 

     return super(OrdersResource, self).hydrate_m2m(bundle) 

とPOSTデータ:

{ 
    "address": "/api/v1/address/1", 
    "contact_no": "/api/v1/users/8269661606", 
    "order_id": "ABCDE", 
    "ordered_products": [ 
    { 
     "price": "40.00", 
     "products": "/api/v1/products/1", 
     "quantity": 2 
    }, 
    { 
     "price": "70.00", 
     "products": "/api/v1/products/2", 
     "quantity": 4 
    }, 
    { 
     "price": "67.00", 
     "products": "/api/v1/products/3", 
     "quantity": 7 
    } 
    ], 
    "payment_method": "COD", 
} 
+0

あなたが 'hydrate_m2m'で行ったように、すべてのordered_productに 'orders'を追加すると、' alter_deserialized_detail_data'でそれを行うと、それは何か悪いですか?それは愚かな質問することができます、私はジャンゴの初心者です、それを考慮してください。 :) – itsji10dra

+1

この場合、 'bundle.obj'が必要です。'alter_deserialized_detail_data'にはあなたはそれを持っていません。 'hydrate_m2m'にはそれがあります。 –

+0

'address'、' contact_no'、 'products'についても同じことができますか?ポストデータに '/ api/v1/resource_name'を追加せず、tastypieを使って追加します。 – itsji10dra

関連する問題