django - 如何从 Django REST 访问完整的对象 JSON 图?
问题描述
我有 Django 模型、序列化程序和视图:
from django.db import models
# Create your models here.
class Contract(models.Model):
contract_no = models.IntegerField(blank=False, unique=True)
customer = models.IntegerField(blank=False)
agent = models.IntegerField(blank=False)
agency = models.IntegerField(blank=False)
cont_date = models.DateField()
def __str__(self):
"""Return a human readable representation of the model instance."""
return "{}".format(self.contract_no)
class ContractOrder(models.Model):
order_no = models.IntegerField(blank=False, unique=True)
order_date = models.DateField()
contract = models.ForeignKey(Contract, on_delete=models.DO_NOTHING)
def __str__(self):
return self.order_no
class Meta:
ordering = ('order_no',)
from rest_framework import serializers
from .models import Contract
from .models import ContractOrder
class ContractSerializer(serializers.ModelSerializer):
"""Serializer to map the Model instance into JSON format."""
class Meta:
"""Meta class to map serializer's fields with the model fields."""
model = Contract
fields = ('contract_no', 'customer', 'agent', 'agency', 'cont_date')
#read_only_fields = ('date_created', 'date_modified')
class ContractOrderSerializer(serializers.ModelSerializer):
"""Serializer to map the Model instance into JSON format."""
class Meta:
"""Meta class to map serializer's fields with the model fields."""
model = ContractOrder
fields = ('order_no', 'order_date', 'contract')
#read_only_fields = ('date_created', 'date_modified')
from rest_framework import generics
from .serializers import ContractSerializer
from .models import Contract
from .serializers import ContractOrderSerializer
from .models import ContractOrder
class ContractCreateView(generics.ListCreateAPIView):
"""This class defines the create behavior of our rest api."""
queryset = Contract.objects.all()
serializer_class = ContractSerializer
def perform_create(self, serializer):
"""Save the post data when creating a new bucketlist."""
serializer.save()
class ContractOrderCreateView(generics.ListCreateAPIView):
"""This class defines the create behavior of our rest api."""
queryset = ContractOrder.objects.all()
serializer_class = ContractOrderSerializer
def perform_create(self, serializer):
"""Save the post data when creating a new bucketlist."""
serializer.save()
结果 /contracts 和 /contract_orders JSON 消息很简单:
[{"contract_no":1,"customer":1,"agent":1,"agency":1,"cont_date":"2018-04-26"},{"contract_no":2,"customer":2,"agent":2,"agency":2,"cont_date":"2018-04-25"}]
[{"order_no":1,"order_date":"2018-04-26","contract":1}]
但我希望有更多扩展的 JSON 消息,特别是:
合同 JSON 实体应该有一个 ContractOrder 实体数组(在我的例子中,合同 1 应该有一个包含 1 个条目的数组)
ContractOrder JSON 实体应该具有扩展的合同实体 - 目前合同字段(在 JSON 中)仅包含标量值 1,但我希望拥有完整的合同实体。
当然——会有JSON图应该完全展开的情况,什么时候应该收缩,然后会有部分扩展的情况?是否有可能在 Django 中实现这一点?
我有经验,在 Java JPA/Hibernate/Spring 中,可以使用注释@OneToMany
和@JsonView
(来自com.fasterxml.jackson.annotation.JsonView
库)控制实体图(在内存中)和实体图的 JSON 视图(在 REST 中),但是如何在 Django 中实现这一点 - 两者- 在内存和 REST JSON 消息中?
解决方案
按如下方式更改序列化程序:
class SimpleContractOrderSerializer(serializers.ModelSerialiser): # Required; otherwise you get into a recursive loop.
class Meta:
"""Meta class to map serializer's fields with the model fields."""
model = ContractOrder
fields = ('order_no', 'order_date',)
class ContractSerializer(serializers.ModelSerializer):
"""Serializer to map the Model instance into JSON format."""
contract_order = SimpleContractOrderSerializer(source='contractorder', many=True, read_only=True)
class Meta:
"""Meta class to map serializer's fields with the model fields."""
model = Contract
fields = ('contract_no', 'customer', 'agent', 'agency', 'cont_date')
#read_only_fields = ('date_created', 'date_modified')
class ContractOrderSerializer(serializers.ModelSerializer):
"""Serializer to map the Model instance into JSON format."""
contract = ContractSerializer(read_only=True)
class Meta:
"""Meta class to map serializer's fields with the model fields."""
model = ContractOrder
fields = ('order_no', 'order_date', 'contract')
#read_only_fields = ('date_created', 'date_modified')
在这里阅读更多:http: //www.django-rest-framework.org/api-guide/relations/#nested-relationships
推荐阅读
- python - Tensorboard 回调导致分段错误
- javascript - firebase 允许设置,但不这样做
- pine-script - 仅当指标先前已标记某个级别时才在指标上绘制形状
- python - 使用 QPainter 在 PyQt 标签中释放鼠标后删除矩形
- spring-data-redis - redisTemplate 与 stringRedisTemplate!为什么 redisTemplate 设置命令不起作用?
- javascript - socket io 开始给出 cors 错误。Cors 请求失败
- http - 如何忽略 CDN 图像的 HTTP 缓存?
- javascript - 如何将 Excel 文件直接链接到 Javascript
- javascript - 使用 fetch API 在 POST 请求时获取空对象
- java - JUnit 一种具有 while 循环和异步功能的方法