代码之家  ›  专栏  ›  技术社区  ›  Peter Pik

序列化程序中的外键不可json序列化

  •  2
  • Peter Pik  · 技术社区  · 8 年前

    我试图创建一个序列化程序,指向来自的两个不同对象 Account 和 Currency ,但当它被调用时,我不断收到以下错误: TypeError: Object of type 'Account' is not JSON serializable . 我做错了什么?

    class InvoiceSerializer(serializers.ModelSerializer):
    
        class Meta:
            """Meta class to map serializer's fields with the model fields."""
            model = Invoice
            fields = ('user', 'currency', 'task', 'deposit_amount', 'receive_amount')
            read_only_fields = ('created_at', 'updated_at')
    
            def create(self, validated_data):
                user = Account.objects.only('id').get(id=validated_data['user'])
                currency = Currency.objects.only('id').get(id=validated_data['currency'])
                return Invoice.objects.create(
                    user=user,
                    currency=currency,
                    task=validated_data['task'],
                    deposit_amount=validated_data['deposit_amount'],
                    receive_amount=validated_data['receive_amount']
                )
    

    来自请求的数据

    {'currency': 2, 'task': 1, 'deposit_amount': 1.005, 'receive_amount': 62793.51, 'user': 23}
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   randyr    8 年前

    我将从 serializers.ModelSerializer 这是使用Django REST框架。

    在这种情况下,您处理的是一个嵌套模型,并且您希望同时显示“主”模型: Invoice Currency 和 Account 模型。

    Django REST框架具有 multiple ways of dealing with nested relationships

    似乎只需要显示ID(而不是对象的实际数据)。这可以在DRF中使用 PrimaryKeyRelatedField

    class InvoiceSerializer(serializers.ModelSerializer):
    
        currency = PrimaryKeyRelatedField(read_only=True)
        user = PrimaryKeyRelatedField(read_only=True)
    
        class Meta:
            model = Invoice
            fields = ('user', 'currency', 'task', 'deposit_amount', 'receive_amount')
            read_only_fields = ('created_at', 'updated_at')
    

    这 可以 还自动获取 currency 和 user 实例,或 queryset 属性 PrimaryKeyRelatedField 必须为此做好准备。很难找到不使用的文档/示例 SomeModel.queryset.all() ,所以你必须自己进行实验。