python - 如何使用 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。
我希望尽快得到答复!多谢
解决方案
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视图
推荐阅读
- webclient - CWE ID 201 使用可能的 WebClient.QueryString Add 方法将敏感信息插入到发送的数据中
- html - 如何将其拆分为单独的文件?
- c# - 无法使用 fodicom 从 PACS 保存 DICOM
- python - 如何制作将频道从一个类别移动到另一个类别的命令
- javascript - Material UI - 主题样式 - 排版不起作用
- ios - UIScrollView - 禁用 isScrollEnabled 将整个视图向上拖动
- javascript - 在哪里为 iframe 设置 sameset=none 属性
- vba - 打开方法无法从 ppt 打开 ppts
- javascript - 如何访问从event.composedPath,Javascript返回的数组中的项目的类列表
- ios - React Native 0.66 iOS 在 AppDelegate RCTRootView 初始化时崩溃