针对OneToOne关系的模型的DRF序列化器
问题描述:
给定具有OneToOne关系的Django模型,如何设置Django Rest Framework序列化器视图,以便API消费者支付现金和支付的终点包括支付模式并允许所有CRUD功能?针对OneToOne关系的模型的DRF序列化器
我试过以下this SO Question here但我似乎无法复制功能。
模式
class Payment(models.Model):
"""
Payment Log
"""
merchant = models.ForeignKey(Entity, on_delete=models.CASCADE, related_name="%(app_label)s_%(class)s_merchant")
customer = models.ForeignKey(Entity, on_delete=models.CASCADE, related_name="%(app_label)s_%(class)s_customer")
payment_method = models.ForeignKey(PaymentMethod, on_delete=models.CASCADE)
trx_amount = models.DecimalField(max_digits=10, decimal_places=3)
class PaymentCash(models.Model):
"""
Cash payments
"""
payment = models.OneToOneField(Payment, on_delete=models.CASCADE, primary_key=True)
date_paid = models.DateField()
# Other fields
class PaymentCheque(models.Model):
"""
Cheque deposits
"""
payment = models.OneToOneField(Payment, on_delete=models.CASCADE, primary_key=True)
cheque_number = models.CharField(max_length=50)
# Other fields
样品查看
class PaymentCashViewSet(ListCreateRetrieveUpdateViewSet):
"""
Cash payment view
"""
queryset = PaymentCash.objects.all()
serializer_class = PaymentCashSerializer
permission_classes = (IsAuthenticated, HasPermission)
当前串行 这虽然不使用的支付模型的所有字段。
class PaymentCashSerializer(serializers.ModelSerializer):
"""Serialize model"""
class Meta:
model = PaymentCash
fields = ('payment', 'date_paid')
使用:Django的== 1.10.2 & djangorestframework == 3.5.1
答
鉴于你的模型和视图,我碰巧写了一些串行对你的看法。可能对你没有太大的帮助,因为我对你的项目的信息有限。
但是,在我所知,到目前为止,我正好写串行器为你这样的,
class EntitySerializer(serializers.ModelSerializer):
class Meta:
model = Entity
fields = '__all__'
class PaymentMethodSerializer(serializers.ModelSerializer):
class Meta:
model = PaymentMethod
fields = '__all__'
class PaymentSerializer(serializers.ModelSerializer):
customer = EntitySerializer()
merchant = EntitySerializer()
payment_method = PaymentMethodSerializer()
class Meta:
model = Payment
fields = ('id', 'payment_method', 'trx_amount', 'customer', 'merchant')
class PaymentCashSerializer(serializers.ModelSerializer):
"""Serialize model"""
payment = PaymentSerializer()
class Meta:
model = PaymentCash
fields = ('payment', 'date_paid')
def create(self, validated_data):
payment_data = validated_data.pop('payment')
customer_data = payment_data.pop('customer')
merchant_data = payment_data.pop('merchant')
payment_method_data = payment_data.pop('payment_method')
customer, c = Entity.objects.get_or_create(**customer_data)
merchant, m = Entity.objects.get_or_create(**merchant_data)
payment_method, p = PaymentMethod.objects.get_or_create(**payment_method_data)
payment = Payment.objects.create(customer=customer, merchant=merchant, payment_method=payment_method, **payment_data)
instance = PaymentCash.objects.create(payment=payment, **validated_data)
return instance
def update(self, validated_data):
payment_data = validated_data.pop('payment')
customer_data = payment_data.pop('customer')
merchant_data = payment_data.pop('merchant')
payment_method_data = payment_data.pop('payment_method')
customer, c = Entity.objects.get(**customer_data)
merchant, m = Entity.objects.get(**merchant_data)
payment_method, p = PaymentMethod.objects.get(**payment_method_data)
payment = Payment.objects.get(customer=customer, merchant=merchant, payment_method=payment_method, **payment_data)
instance = PaymentCash.objects.get(id=validated_data.get('id'))
instance.payment = payment
instance.save()
return instance
自定义创建和更新方法,将需要从你一些修改,我只写了一个理想的场景。希望这对你有很大的帮助。
+0
谢谢。显示需要什么,并让我解开 – lukik
你能展示相应的串行器吗? – Nifled
为现金付款添加了序列化程序 – lukik