Django 具有OneTONE关系的模型的DRF序列化程序

Django 具有OneTONE关系的模型的DRF序列化程序,django,django-rest-framework,Django,Django Rest Framework,鉴于Django模型具有OneToOne关系,如何设置Django Rest框架序列化程序和视图,以便API使用者在现金支付和支票支付的终点包括支付模型并允许所有CRUD功能 我尝试了以下内容,但似乎无法复制功能 型号 class Payment(models.Model): """ Payment Log """ merchant = models.ForeignKey(Entity, on_delete=models.CASCADE, related_name

鉴于Django模型具有OneToOne关系,如何设置Django Rest框架序列化程序和视图,以便API使用者在现金支付和支票支付的终点包括支付模型并允许所有CRUD功能

我尝试了以下内容,但似乎无法复制功能

型号

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

自定义的create和update方法需要您做一些修改,因为我只为理想的场景编写过。希望这将对您有很大帮助。

您能展示相应的序列化程序吗?添加了一个现金付款的序列化程序谢谢。显示了所需的内容并使我摆脱困境