首页 > 解决方案 > 如何使用 Django 创建嵌套 API (CRUD)?

问题描述

我有一个问题,我很累。我有一个服务模型,它与其他模型有很多关系!这是我的模型:

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}'

问题是:我想为此模型创建一个 API,它将包含其他模型的嵌套 API,如下所示:

{
  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,
}

我在 Django Rest Framework 文档中找到了关于嵌套 API 的信息,但是当我尝试它时,它给了我一个子模型的 API,里面有一个服务 api。

我希望尽快得到答复!多谢

标签: pythondjangopython-3.xapidjango-rest-framework

解决方案


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']

这是我的观点:


# 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)

我只放了服务api视图


推荐阅读