简体   繁体   中英

how to create a nested API (CRUD) using Django?

i have a problem and i got very tired. i have a Service Model and it has a lot of relation with other models! This is my model:

class Service(models.Model):
    user_iduser = models.ForeignKey(User, models.DO_NOTHING, db_column='User_idUser')  # Field name made lowercase.
    request_date = models.DateTimeField(blank=True, null=True)
    country = CountryField(blank_label='(إختر الدولة)')  # ++++++++++++++++++
    insurance = models.OneToOneField(Insurance, models.DO_NOTHING, blank=True, null=True)
    omra = models.OneToOneField(Omra, models.DO_NOTHING, blank=True, null=True)
    organized_journey = models.OneToOneField(OrganizedJourney, models.DO_NOTHING)
    other = models.OneToOneField(Other, models.DO_NOTHING, blank=True, null=True)
    temp_hotel_reservation = models.OneToOneField('TempHotelReservation', models.DO_NOTHING, blank=True, null=True)
    temp_ticket = models.BooleanField(blank=True, null=True)
    ticket = models.OneToOneField('Ticket', models.DO_NOTHING, blank=True, null=True)
    travel_hotel_reservation = models.OneToOneField('TravelHotelReservation', models.DO_NOTHING, blank=True, null=True)
    visa = models.OneToOneField('Visa', models.DO_NOTHING, blank=True, null=True)
    visa_rdv = models.BooleanField(blank=True, null=True)
    visa_request_form = models.BooleanField(blank=True, null=True)
    client = models.ManyToManyField("Client")
    is_active = models.BooleanField(default=True)


    class Meta:
        managed = True
        db_table = 'service'
        unique_together = (('id', 'user_iduser'),)

    def __str__(self):
        return f'service to client {self.country}'

the problem is: i want to create an API for this model and it will contains a nested APIs of other model like this:

{
  clients: [
    {
      firstName_ar,
      lastName_ar,
      firstName_fr,
      lastName_fr,
      passport_id,
      phone,
      email_fb,
      date_birth
      place_birth
    },
    {
      firstName_ar,
      lastName_ar,
      firstName_fr,
      lastName_fr,
      passport_id,
      phone,
      email_fb,
      date_birth
      place_birth
    }
    ]
  country: 'DZ',
  insurance: {
    number: 1245454,
  } || False,
  omra:{
    food: true,
    duration: 15,
    start_date: '2020-04-05',
    hotel_name: 'INTTIC Residence',
    area: 'Makkah',
    distance_from_haram: 5000,
    room_size: 4
  },
  organized_journey: {
    duration: 45,
    start_date: '2020-04-05',
    room_type: 3
  },
  other: {
  name: 'Name',
  details: 'Details'
  },
  temp_hotel_reservation: {
    type: 'voucher'
  },
  temp_ticket: true,
  ticket: {
    type: 'CHTK',
    number: 484544
  },
  travel_hotel_reservation: {
    city: 'Chlef',
    reservation_number: 12154
  },
  visa: {
    duration: 45,
    single_voyage: True,
  },
  visa_rdv: true,
  visa_request_form: true,
}

i found in Django Rest Framework docs about nested API but when i tried it it gave me an API of the child Model with a service api inside it.

i hope to get an answer soon! thanks a lot

class OmraSerializer(serializers.ModelSerializer):
    class Meta:
        model = Omra
        fields = '__all__'


class VisaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Visa
        fields = '__all__'

class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Client
        fields = '__all__'

class ServiceSerializer(serializers.ModelSerializer):
    omra = OmraSerializer(many=True)
    visa = VisaSerializer(many=True)
    client = ClientSerializer(many=True)

    class Meta:
        model = Service
        fields = [..., 'omra', 'visa', 'client']

and this is my view:


# Service API
class ServiceList(APIView):
    """
    List all services, or create a new service.
    """
    def get(self, request, format=None):
        services = Service.objects.filter(is_active=True)
        serializer = ServiceSerializer(services, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = ServiceSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class ServiceDetail(APIView):
    """
    Retrieve, update or delete a service instance.
    """
    def get_object(self, pk):
        try:
            return Service.objects.get(pk=pk)
        except Service.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        service = self.get_object(pk)
        if service.is_active == False:
            content = {'please move along': 'nothing to see here'}
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        serializer = ServiceSerializer(service)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        service = self.get_object(pk)
        serializer = ServiceSerializer(service, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        service = self.get_object(pk)
        if service.is_active == True: 
            service.is_active = False
            service.save()
        serializer = ServiceSerializer(service, data=request.data)
        if serializer.is_valid():
            serializer.save()
        print(serializer.data)
        return Response(status=status.HTTP_204_NO_CONTENT)

i put just service api view

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM