2017-05-30 12 views
1

OneToOne関係を持つDjangoモデルの場合、Django Restフレームワークシリアライザ&ビューをどのように設定すれば、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

+0

対応するシリアライザを表示できますか? – Nifled

+0

現金支払いのシリアライザを追加しました – lukik

答えて

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

関連する問題