python - DRF oneToOneField 创建序列化器

标签 python django serialization django-rest-framework

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

我想要序列化的是“TradePost”模型,其中包含帖子和 ProductItem。

我已经通过使用这个有了“ProductItemSerializer”和“PostSerializer”..我如何序列化它们?与创造?不是通过告诉现有记录 pk 值。

模型.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 =

最佳答案

类似于writable nested serializer ,你可以尝试这样的事情:

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,这样会更容易阅读

关于python - DRF oneToOneField 创建序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42314882/

相关文章:

python - SublimeREPL 到 python

python - 有关管理大型、多方面的企业 Python 代码库的信息?

python - 使用 Rauth 和 Django 正确创建 OAuth2Service

java - 为什么这不可序列化?

javascript - 在 Node.js 套接字中写入和 'data' 事件

Python urllib 卡住特定的 URL

python - 我如何让python将瑞典语字母(åäö)写入html文件?

python - 使用 Django 项目和根目录子文件夹中的静态文件

python - 是否可以在 Google App Engine 上使用 Django 1.2?

java - 反转(解析输出)Arrays.toString(int[])