2017-07-20 18 views
2

我写一个小系统的Transaction有一个AccountCategory与之相关的。目前,我在TransactionSerializer中使用PrimaryKeyRelatedField。我需要的时候GET荷兰国际集团的所有交易或只有一个,在JSON响应返回相关AccountCategory细节。通过使用PrimaryKeyRelatedField,反应是一样的:如何从模型中获取,在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, 
    ... 
    }, 
    ... 
] 

为了使细节相关的帐户和类别,我已经做了在TransactionSerializer如下:

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

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

但我无法创建新交易。它显示错误说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

首先重写模式相关名称的Fileds休息落实。

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

嗨。同样的错误依然存在。它会说所有三个领域的用户,类别和帐户都是必需的。 – mfgabriel92

0

创建两个串行器,一个上市,一个用于创建并获得成功。

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 
相关问题