Django ORM with Rest API 编写复杂查询

Django ORM with Rest API writing complex query

我写了一个功能,如果一个人有相关数据,用户就不能执行更新。

这是我的模型:

class Person(models.Model):
    alias = models.UUIDField(primary_key=True,default=uuid.uuid4, editable=False, unique=True)
    name = models.CharField(max_length=20)

class Appointment(models.Model):
    patient = models.ForeignKey(Person, related_name="patient_for_appointment", on_delete=models.CASCADE)
    data = models.CharField(max_length=20)

class Sales(models.Model):
    customer = models.ForeignKey(Person, related_name="customer_for_sales", on_delete=models.CASCADE)
    amount = models.FloatField()

class Prescription(models.Model):
    patient = models.ForeignKey(Person, related_name="Patient_for_prescription", on_delete=models.CASCADE)
    details = models.CharField(max_length=100)

我的主键是 UUID,名为 alias

这是我的 api 视图:

from django.shortcuts import render
from . models import Person, Appointment, Prescription, Sales
from . serializers import  PersonSerializers
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from rest_framework.response import Response
from rest_framework.exceptions import APIException

class PersonView(RetrieveUpdateDestroyAPIView):
    queryset = Person.objects.all()
    serializer_class = PersonSerializers
    lookup_field = 'alias'

    def update(self, request, *args, **kwargs):
        # person = Person.objects.filter(alias=kwargs['alias'])
        appointment = Appointment.objects.filter(patient__alias=kwargs['alias'])
        prescription = Prescription.objects.filter(patient__alias=kwargs['alias'])
        sales = Sales.objects.filter(customer__alias=kwargs['alias'])

        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)

        if prescription:
            raise APIException('CANT UPDATE')
        elif appointment:
            raise APIException('CANT UPDATE')
        elif sales:
            raise APIException('CANT UPDATE')
        else:         
            self.perform_update(serializer)

        return Response(serializer.data)

仔细查看上面的一些查询:

        appointment = Appointment.objects.filter(patient__alias=kwargs['alias'])
        prescription = Prescription.objects.filter(patient__alias=kwargs['alias'])
        sales = Sales.objects.filter(customer__alias=kwargs['alias'])

我在这里实现如果一个人有salesappointmentprescription,用户不能执行更新并抛出错误。一切正常

但是我遇到了查询的性能问题,我正在尝试用一个人的主键创建一个 query/filter 来获取这个人 AppointmentSalesPrescription.

上面的东西工作正常,但我正在尝试亲自进行一个查询,如下所示:

person = Person.objects.filter(alias='a person alias/primary key).prefetch_related..............

但是我没能实现。任何人都可以帮我过滤我的 Person 模型,只得到它的预约、销售和处方吗?

我试了很久就卡在这里了

您可以通过以下方式制作:

      person=Person.objects.filter(alias=kwargs.get('alias').values("Patient_for_prescription", "patient_for_appointment", "customer_for_sales" , "name", "alias")

将使用此查询列出所有人员数据和相关预约、销售和处方。

查询集可能包含多行,具体取决于数据库中的数据。为避免这种情况,您可以在查询中使用 .first().last()where 条件来为您的视图获取一个人对象,因为您的视图需要一个对象。