Как получить доступ к полному объектному графу JSON из Django REST? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть модели, сериализаторы и просмотры 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()

И сообщения JSON о результатах / контрактах и ​​/ contract_orders просты:

[{"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, а именно:

  1. Контракт JSON должен иметь массив сущностей ContractOrder (в моем случае контракт 1 должен иметь массив с 1 записью)

  2. Сущность ContractOrder JSON должна иметь расширенную сущность договора - в настоящее время поле договора (в JSON) содержит только скалярное значение 1, но я хотел бы иметь полную сущность договора.

Конечно - будут ситуации, когда граф JSON должен быть полностью расширен, когда он должен быть свернут, а затем будут ситуации, когда расширение должно быть частичным? Можно ли добиться этого в Джанго?

У меня есть опыт, что в Java JPA / Hibernate / Spring можно управлять графом сущностей (в памяти) и представлением JSON графа сущностей (в REST), используя аннотации @OneToMany и @JsonView (из * 1023). * библиотека) но как этого добиться в Django - как в памяти, так и в сообщениях REST JSON?

1 Ответ

0 голосов
/ 26 апреля 2018

Измените ваши сериализаторы следующим образом:

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-гид / отношения / # вложенные отношения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...