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'])
我在这里实现如果一个人有sales
或appointment
或prescription
,用户不能执行更新并抛出错误。一切正常
但是我遇到了查询的性能问题,我正在尝试用一个人的主键创建一个 query/filter 来获取这个人 Appointment
和 Sales
和 Prescription
.
上面的东西工作正常,但我正在尝试亲自进行一个查询,如下所示:
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
条件来为您的视图获取一个人对象,因为您的视图需要一个对象。
我写了一个功能,如果一个人有相关数据,用户就不能执行更新。
这是我的模型:
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'])
我在这里实现如果一个人有sales
或appointment
或prescription
,用户不能执行更新并抛出错误。一切正常
但是我遇到了查询的性能问题,我正在尝试用一个人的主键创建一个 query/filter 来获取这个人 Appointment
和 Sales
和 Prescription
.
上面的东西工作正常,但我正在尝试亲自进行一个查询,如下所示:
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
条件来为您的视图获取一个人对象,因为您的视图需要一个对象。