2017-07-20 2 views
2

私はTransactionAccountとそれに関連するCategoryを持つ小さなシステムを書いています。現在、私はTransactionSerializerPrimaryKeyRelatedFieldを使用しています。私は、GETすべてのトランザクションを送信するか、または1つだけ、関連するAccountCategoryの詳細をJSON応答に戻す必要があります。 TransactionSerializerに次モデルから取得する方法、関連するモデルの詳細をJSONレスポンスに表示する方法はありますか?

class TransactionSerializer(serializers.ModelSerializer): 
    account = serializers.PrimaryKeyRelatedField(read_only=True) 
    category = serializers.PrimaryKeyRelatedField(read_only=True) 

# output: 
[ 
    transaction: { 
    id: 1, 
    account: 1 
    category: 3, 
    ... 
    }, 
    ... 
] 

は細部に関連するアカウントとカテゴリをもたらすために、私がやった:

class TransactionSerializer(serializers.ModelSerializer): 
    account = AccountSerializer() 
    category = CategorySerializer() 

# output: 
[ 
    transaction: { 
    id: 1, 
    account: { id: 1, name: "Foo", ... } 
    category: { id: 3, name: "Bar", ... }, 
    ... 
    }, 
    ... 
] 

しかし、私は作成することはできませんPrimaryKeyRelatedField使用することにより、応答が、これは似ています新しい取引。 accountcategoryというエラーが表示されます。シリアライザ内でフィールドをread_onlyに移動しようとしましたが、別のエラーではこれらのフィールドはfieldsリスト内にあるはずです。取引の

views.py

class TransactionList(APIView): 
    def get(self, request): 
     user_id = request.user.pk 
     transactions = Transaction.objects.filter(user_id=user_id).order_by('-created_at') 
     serializer = TransactionSerializer(transactions, many=True) 

     return Response(serializer.data) 

    def post(self, request): 
     account = Account.objects.get(pk=request.data['account']) 
     category = Category.objects.get(pk=request.data['category']) 
     serializer = TransactionSerializer(data=request.data) 

     if serializer.is_valid(): 
      serializer.save(user=request.user, account=account, category=category) 

      return Response(serializer.data, status=HTTP_201_CREATED) 

     return Response(serializer.errors, status=HTTP_400_BAD_REQUEST) 


class TransactionDetail(APIView): 
    def get(self, request, pk): 
     try: 
      transaction = Transaction.objects.get(pk=pk) 
      serializer = TransactionSerializer(transaction) 

      return Response(serializer.data) 
     except: 
      raise Http404 

urls.py

urlpatterns = [ 
    url(r'^$', views.TransactionList.as_view(), name="transaction_list"), 
    url(r'^(?P<pk>[0-9]+)/$', views.TransactionDetail.as_view(), name="transaction"), 
] 

models.py

class Transaction(models.Model): 
    user = models.ForeignKey(User, default=None) 
    account = models.ForeignKey(Account, default=None) 
    category = models.ForeignKey(Category, default=None) 
    name = models.CharField(max_length=32) 
    amount = models.DecimalField(max_digits=10, decimal_places=2, default="0.0") 
    description = models.CharField(max_length=256, default=None, null=True) 
    created_at = models.DateTimeField(default=timezone.now) 
    updated_at = models.DateTimeField(default=timezone.now) 

は、これが私の問題です。新しいトランザクションを作成するにはどうすればいいですか?IDでアカウントとカテゴリを割り当てますが、すべてを取得する場合はすべての詳細を持ってきますか?

+0

ビューとURLを表示します。 –

+0

ビューとURLファイルコードで質問が更新されました。 – mfgabriel92

+0

モデルを提供できますか? – marin

答えて

-1

モデルを残りの実装用に関連する名前のファイルに書き直します。

class Transaction(models.Model): 
    user = models.ForeignKey(User, default=None, related_name="user_serialzer") 
    account = models.ForeignKey(Account, default=None, related_name="account_serialzer") 
    category = models.ForeignKey(Category, default=None, related_name="category_serialzer") 
    name = models.CharField(max_length=32) 
    amount = models.DecimalField(max_digits=10, decimal_places=2, default="0.0") 
    description = models.CharField(max_length=256, default=None, null=True) 
    created_at = models.DateTimeField(default=timezone.now) 
    updated_at = models.DateTimeField(default=timezone.now) 

そして、シリアライザ:

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fileds = '__all__' 


class AccountSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Account 
     fileds = '__all__' 

class CategorySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Category 
     fileds = '__all__' 

class SerializerTransactions(serializers.ModelSerializer): 
    user_serialzer = UserSerializer(many=True) 
    account_serialzer = AccountSerializer(many=True)  
    category_serialzer = CategorySerializer(many=True) 

    class Meta: 
     model = Transaction 
     fileds = ('id', 'name', 'user_serialzer', 'account_serialzer', 'category_serialzer',) 
+0

こんにちは。同じエラーが続く。ユーザー、カテゴリ、アカウントの3つのフィールドがすべて必要とされます。 – mfgabriel92

0

は2つのシリアライザ、上場のための1つのトリックをしたの作成のための1つを作成します。

class ListTransactionSerializer(serializers.ModelSerializer): 
    account = AccountSerializer() 
    category = CategorySerializer() 

    class Meta: 
     model = Transaction 
     fields = '__all__' 


class CreateTransactionSerializer(serializers.ModelSerializer): 
    account = serializers.PrimaryKeyRelatedField(read_only=True) 
    category = serializers.PrimaryKeyRelatedField(read_only=True) 

    class Meta: 
     model = Transaction 
     fields = '__all__' 

    def create(self, validated_data): 
     """ 
     Create and return a new 'Transaction' instance 
     :param validated_data: 
     :return: Transaction 
     """ 
     return Transaction.objects.create(**validated_data) 

    def update(self, instance, validated_data): 
     pass 
関連する問題