Невозможно сохранить отношения между двумя объектами с помощью Django Rest Framework - PullRequest
0 голосов
/ 25 февраля 2020

Я создаю приложение Django / React, чтобы пользователи могли отправлять заказы, которым нужно go от A до B. Пользователь сначала сохраняет адреса в базе данных, а затем выбирает их в форме заказа. Когда они отправляют, я пытаюсь создать связь в базе данных, я использую Django сериализаторы Rest Framework для создания объекта 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')

ViewSets

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

Есть идеи? Спасибо

1 Ответ

0 голосов
/ 25 февраля 2020

Решил, заменив 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')
...