DRF OneToOneField创建序列化器



尝试使用drf/create serizlizer进行一些嵌套的模型创建。

我正在尝试序列化的是" Tradepost"模型,该模型中有帖子和ProductiTem。

我已经使用了" Productitemserializer"one_answers"后序列化器"。如何序列化它们?与创造?不是通过以PK值讲述现有记录。

models.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) + ']'

在serialziers.py

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 =

类似于可写的嵌套序列化器,您可以尝试这样的东西:

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

对于Python,请关注命名约定并使用lower_case_with_underscores,例如base_productbase_post,阅读

会更容易

您可以使用序列化代表字段,例如,

class TradePostCreateSerializer(serializers.ModelSerializer):
    basePost = PostSerializer()
    baseProductItem = ProductItemSerializer()
    class Meta:
        model = TradePost
        fields = ('basePost', 'baseProductItem',)

参考:

drf嵌套关系

如果您正在寻找可写的嵌套序列化

可写的嵌套序列化

最新更新