【问题标题】:Ember - saving Foreign Key relationship, using Django DRF (JSON API)Ember - 使用 Django DRF (JSON API) 保存外键关系
【发布时间】:2019-05-15 01:10:09
【问题描述】:

我有以下 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 模型中,关系很简单(我创建了一个序列化程序,将 Ember 中的 paymentMethod 转换为 Django 的 payment_method)

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
});

这保存了关于用户对象的订单罚款,但不保存付款方式关系。

检查 Order 序列化程序中的 create 方法后,付款方式对象不存在。

为了解决这个问题,我尝试重写订单视图集的 create 方法,如下所示:

 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 响应,而上述不是。

我必须有一种更简单的方法来保存付款方式关系?

非常感谢任何帮助!

【问题讨论】:

    标签: ember.js django-rest-framework ember-data


    【解决方案1】:

    您应该返回 serializer 数据而不是 request

    from rest_framework.response import Response
    
    ...
    
    return Response(data=s.data)
    

    此外,使用标准 Response from rest_framework 本身可以让您的工作更轻松。

    【讨论】:

    • 非常感谢 - 排序 - 我尝试了很多不同的选项!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2018-03-13
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多