我写一个小系统的Transaction
有一个Account
和Category
与之相关的。目前,我在TransactionSerializer
中使用PrimaryKeyRelatedField
。我需要的时候GET
荷兰国际集团的所有交易或只有一个,在JSON响应返回相关Account
和Category
细节。通过使用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", ... },
...
},
...
]
但我无法创建新交易。它显示错误说account
和category
是必需的。我试着将字段移到序列化程序中的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分配一个账户和类别,然后在检索全部时,提供所有的细节?
显示你的意见和URL。 –
更新了视图和URL文件代码的问题。 – mfgabriel92
你能提供你的模型吗? – marin