无法使用Django Rest Framework保存两个对象之间的关系

2024-10-02 10:20:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个Django/React应用程序,允许用户提交需要从a到B的订单。用户最初将地址保存在数据库中,然后在订单表单中选择。当他们提交时,我尝试在数据库中创建关系,我使用Django Rest框架序列化程序在数据库中创建Order对象

不幸的是,我无法成功保存项目,因为我没有正确地将地址链接到订单。我收到以下错误:

destinationAddress: ["Invalid value."]
originAddress: ["Invalid value."]

模型

class Order(models.Model):
    originAddress = models.ForeignKey(Address, related_name="originAddress",  null=True, on_delete=models.CASCADE)
    destinationAddress = models.ForeignKey(Address, related_name="destinationAddress",   null=True, on_delete=models.CASCADE)
    packages = models.CharField("Packages", max_length=1024)

class Address(models.Model):
    address_code = models.CharField(max_length=250)
    contact = models.CharField("Contact", max_length=1024)
    phone = models.CharField("Phone", max_length=20)
    company = models.CharField("Company", max_length=250)
    addressLine1 = models.CharField("Address line 1", max_length=1024)
    addressLine2 = models.CharField("Address line 2", max_length=1024, blank=True)
    postalCode = models.CharField("Postal Code", max_length=12)
    city = models.CharField("City", max_length=1024)
    state = models.CharField("State", max_length=250)

序列化程序

class AddressSerializer(serializers.ModelSerializer):

    class Meta:
        model = Address
        fields = '__all__'


class OrderSerializer(serializers.ModelSerializer):
    originAddress = serializers.SlugRelatedField(
        queryset=Address.objects.all(),
        slug_field='pk'
    )
    destinationAddress = serializers.SlugRelatedField(
        queryset=Address.objects.all(),
        slug_field='pk'
    )


    class Meta:
        model = Order
        fields = ('id', 'packages', 'destinationAddress', 'originAddress')

视图集

class OrderViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.all()

    permission_classes = [
        permissions.AllowAny
    ]

    serializer_class = OrderSerializer

class AddressViewSet(viewsets.ModelViewSet):
    queryset = Address.objects.all()

    permission_classes = [
        permissions.AllowAny
    ]

    serializer_class = AddressSerializer

有什么想法吗?谢谢


Tags: 订单数据库objectsaddressmodelsorderalllength
1条回答
网友
1楼 · 发布于 2024-10-02 10:20:21

通过将SlugRelatedField替换为PrimaryKeyRelatedField解决了此问题

class OrderSerializer(serializers.ModelSerializer):

    originAddress = serializers.PrimaryKeyRelatedField(
        queryset=Address.objects.all(), allow_null=True, required=False
    )
    destinationAddress = serializers.PrimaryKeyRelatedField(
        queryset=Address.objects.all(), allow_null=True, required=False
    )

    class Meta:
        model = Order
        fields = ('id', 'packages', 'destinationAddress', 'originAddress')

相关问题 更多 >

    热门问题