Ember - 保存外键关系,使用 Django DRF (JSON API)
Ember - saving Foreign Key relationship, using Django DRF (JSON API)
我有以下订单、用户和付款方式模型。
在 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
});
这会保存关于用户对象的订单,但不会保存付款方式关系。
检查订单序列化程序中的创建方法后,付款方式对象不存在。
为了解决这个问题,我尝试重写订单视图集的创建方法,如下所示:
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})
这有效 - 并保存了付款方式关系,但我需要 return 一个有效的 JSON API 响应,上面不是。
必须有更简单的方法让我保存付款方式关系吗?
非常感谢任何帮助!
你应该return序列化器数据而不是请求:
from rest_framework.response import Response
...
return Response(data=s.data)
此外,使用标准 Response
from rest_framework
本身可以使您的工作更轻松。
我有以下订单、用户和付款方式模型。
在 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
});
这会保存关于用户对象的订单,但不会保存付款方式关系。
检查订单序列化程序中的创建方法后,付款方式对象不存在。
为了解决这个问题,我尝试重写订单视图集的创建方法,如下所示:
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})
这有效 - 并保存了付款方式关系,但我需要 return 一个有效的 JSON API 响应,上面不是。
必须有更简单的方法让我保存付款方式关系吗?
非常感谢任何帮助!
你应该return序列化器数据而不是请求:
from rest_framework.response import Response
...
return Response(data=s.data)
此外,使用标准 Response
from rest_framework
本身可以使您的工作更轻松。