gpt4 book ai didi

django - 具有 OneToOne 关系的模型的 DRF 序列化程序

转载 作者:行者123 更新时间:2023-12-04 03:06:02 25 4
gpt4 key购买 nike

给定具有 OneToOne 关系的 Django 模型,如何设置 Django Rest Framework 序列化器和 View ,以便 API 消费者以现金支付和支票支付的端点包括支付模型并允许所有 CRUD功能?

我试过关注 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

示例 View

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

最佳答案

鉴于您的模型和 View ,我碰巧为您的 View 编写了一些序列化程序。可能对您没有太大帮助,因为我对您的项目的了解也很有限。

但是,据我所知,我碰巧是这样为你编写序列化程序的,

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

自定义创建和更新方法需要您进行一些修改,因为我只是针对理想情况编写的。希望对您有所帮助。

关于django - 具有 OneToOne 关系的模型的 DRF 序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44259003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com