2017-02-18 16 views
0

drf/create serizlizerを使用していくつかのネストされたモデルを作成しようとしています。DRF oneToOneFieldシリアライザを作成

私がシリアル化しようとしているのは、ポストを持つ 'TradePost'モデルとその中のProductItemです。

私は既に 'ProductItemSerializer'とこれを使って 'PostSerializer'を持っています。どうすればそれらをシリアル化できますか?創造と? pk値で既存のレコードを伝えるのではなく、

models.py serialziers.pyで

class ProductItem(models.Model): 
    baseProduct = models.ForeignKey(Product, related_name='baseProduct') 

    seller = models.ForeignKey(User) 

    price = models.DecimalField(max_digits=6, decimal_places=2) 

    isOrderClosed = models.BooleanField() 
    isTradeCompleted = models.BooleanField() 


    def __str__(self): 
     return '[seller = '+self.seller.username+']' + '[product = '+(str)(self.baseProduct)+']' + '[id = '+(str)(self.id)+']' 




class TradePost(models.Model): 

    basePost = models.OneToOneField(Post) 

    baseProductItem = models.OneToOneField(ProductItem) 

    def __str__(self): 
     return '[post = ' + (str)(self.basePost) + ']' + '[product = ' + (str)(self.baseProductItem) + ']' + '[id = ' + (str)(self.id) + ']' 

class ProductItemCreateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ProductItem 
     fields = ('baseProduct', 'price') 



#??? 
class TradePostCreateSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = TradePost 
     fields = ('basePost', 'baseProductItem',) 

    def create(self, validated_data): 
     post = 

答えて

0
あなたが例えば、フィールドを表現するためにシリアライザを使用することができます

class TradePostCreateSerializer(serializers.ModelSerializer): 
    basePost = PostSerializer() 
    baseProductItem = ProductItemSerializer() 

    class Meta: 
     model = TradePost 
     fields = ('basePost', 'baseProductItem',) 

参考:

DRF Nested relationships

あなたが書き込み可能なネストされたシリアライザwritable nested serializerと同様に

Writable nested serializers

+0

私はその意味で、それはすでにレコードが作成されているpk値が必要です。 または?私は理解が間違っていますか? – uzu

+0

これは { "basePost":[ "不正なタイプです。予想されるpk値、受信したdict。 ] "baseProductItem":[ "不正なタイプです。予想されるpk値、受信したdict" ] } – uzu

0

を探しているなら、あなたはこのような何か試すことができます:Python用

class TradePostCreateSerializer(serializers.ModelSerializer): 
    basePost = PostCreateSerializer() 
    baseProductItem = ProductItemCreateSerializer() 

    class Meta: 
     model = TradePost 
     fields = ('basePost', 'baseProductItem',) 

    def create(self, validated_data): 
     # pop out the dict to create post and item, depend on whether you want to create post or not 
     post = validated_data.get('basePost') 
     product = validated_data.get('baseProductItem') 
     # create post first 
     trade_post = None 
     post_obj = Post.objects.create(**post) 
     if post_obj: 
      # create product item 
      prod_item = ProductItem.objects.create(basePost=post_obj, **product) 
      trade_post = TradePost.objects.create(baseProduct=prod_item, **validated_data) 
     return trade_post 

を、命名規則に従ってくださいとlower_case_with_underscoresbase_product,base_postのように使用すると、読みやすくなります。

関連する問題