Ember - сохранение отношения внешнего ключа с использованием Django DRF (JSON API) - PullRequest
0 голосов
/ 14 мая 2019

У меня есть следующие модели для Order, User и PaymentMethod.

В Django они определены (поля для краткости исключены) следующим образом:

class User:
    email = models.EmailField(unique=True)
    class JSONAPIMeta:
        resource_name = 'users'

class PaymentMethod:
    name = models.CharField(max_length=255, unique=True)
    class JSONAPIMeta:
        resource_name='payment-methods'

class Order:
    user = models.ForeignKey(User,blank=True,null=True,on_delete=models.SET_NULL,related_name="user_orders")
    payment_method = models.ForeignKey(PaymentMethod, null=True, on_delete=models.SET_NULL, related_name="order_payment_methods")

    class JSONAPIMeta:
        resource_name = 'orders'

У меня есть классы сериализатора какследующим образом:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id','email')

class PaymentMethodSerializer(serializers.ModelSerializer):
    class Meta:
        model = PaymentMethod
        fields = ('id', 'name')

class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = ('id','user','payment_method')

Представления выглядят следующим образом:

from rest_framework import viewsets

class OrderViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.all().order_by('id')
    serializer_class = OrderSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class PaymentMethodViewSet(viewsets.ModelViewSet):
    queryset = PaymentMethod.objects.all()
    serializer_class = PaymentMethodSerializer

В моих моделях Ember отношения просты (я создал сериализатор, который преобразует paymentMethod в Ember в payment_method дляDjango)

user:

export default DS.Model.extend({
    email: DS.attr('string'),
});

order:

export default DS.Model.extend({
    user: DS.belongsTo('user'),
    paymentMethod: DS.belongsTo('payment-method'),
});

payment-method:

export default DS.Model.extend({
    name: DS.attr('string'),
    orderPaymentMethods: DS.hasMany('order')
});

В Ember я сохраняю заказ следующим образом, уже получив объекты для пользователя и способ оплаты:

let orderData = {
   user: userObject,
   paymentMethod: paymentMethodObject
};

this.store.createRecord('order', orderData).save().then((order) => {
    ... redirect etc
});

Это сохраняет штраф в отношении заказаобъект пользователя, но он не сохраняет взаимосвязь метода оплаты.

При проверке метода create в сериализаторе Order объект метода оплаты отсутствует.

Чтобы исправить это, я попытался переопределить метод создания представления заказа, установленный следующим образом:

 def create(self, request, *args, **kwargs):
     payment_method_id = request.data.get('payment-method').get('id')
     payment_method = PaymentMethod.objects.get(id=payment_method_id)

     s = OrderSerializer(data=request.data)
     if s.is_valid():
         s.save(payment_method=payment_method)
     return JsonResponse({"data":request.data})

Это работает - и сохраняет отношение метода оплаты, но мне нужно вернуть действительныйОтвет JSON API, который не является вышеуказанным.

Должен ли я быть проще, чтобы сохранить связь с методом оплаты?

Любая помощь очень ценится!

1 Ответ

1 голос
/ 14 мая 2019

Вы должны вернуть сериализатор данные вместо запроса :

from rest_framework.response import Response

...

return Response(data=s.data)

Также, используястандарт Response от rest_framework сам по себе может облегчить вашу работу.

...