Python 3.x 如何限制在Django中代表其他用户插入数据?
我的django项目中有以下代码Python 3.x 如何限制在Django中代表其他用户插入数据?,python-3.x,django,django-models,django-rest-framework,django-views,Python 3.x,Django,Django Models,Django Rest Framework,Django Views,我的django项目中有以下代码 models.py serializers.py views.py 然后,这些视图分别与端点医生/和患者/连接起来。我遇到的问题是限制所有者(在本例中是医院、耶鲁大学或米德尔塞克斯大学)不能代表其他医生插入患者。以下屏幕截图显示我以“米德尔塞克斯”身份登录,但可以选择代表Bob博士或Alice博士插入患者,他们与耶鲁医院(所有者)而不是米德尔塞克斯医院有关联。我如何解决这个问题?如果我以“米德尔塞克斯”身份登录,我将只看到弗雷德医生,作为将医院中选定的医生与新患
models.py
serializers.py
views.py
然后,这些视图分别与端点医生/
和患者/
连接起来。我遇到的问题是限制所有者(在本例中是医院、耶鲁大学或米德尔塞克斯大学)不能代表其他医生插入患者。以下屏幕截图显示我以“米德尔塞克斯”身份登录,但可以选择代表Bob博士或Alice博士插入患者,他们与耶鲁医院(所有者)而不是米德尔塞克斯医院有关联。我如何解决这个问题?如果我以“米德尔塞克斯”身份登录,我将只看到弗雷德医生,作为将医院中选定的医生与新患者关联的选项?请参阅下图,以更好地了解我想要了解的内容 请查看DRF文档中的。请尝试更新您的serializers.py
,以便根据当前登录的用户筛选医生:
从rest\u框架导入序列化程序
从。模型导入医生、患者
类DoctorSerializer(serializers.ModelSerializer):
类元:
模特=医生
字段=[
“姓名”,
“教育”
]
类FilterEdctor(序列化程序.SlugRelatedField):
def get_queryset(自我):
queryset=Doctor.objects.all()
request=self.context.get('request',None)
如果请求为无:
返回查询集
如果不是request.user.is_superuser:
queryset=queryset.filter(hospital=request.user)
返回查询集
类PatientSerializer(serializers.ModelSerializer):
医生=过滤器安装工(
slug_field=“name”,
多=假,
allow_null=False
)
类元:
模型=患者
字段=['name','doctor']
请查看DRF文档中的。请尝试更新您的serializers.py
,以便根据当前登录的用户筛选医生:
从rest\u框架导入序列化程序
从。模型导入医生、患者
类DoctorSerializer(serializers.ModelSerializer):
类元:
模特=医生
字段=[
“姓名”,
“教育”
]
类FilterEdctor(序列化程序.SlugRelatedField):
def get_queryset(自我):
queryset=Doctor.objects.all()
request=self.context.get('request',None)
如果请求为无:
返回查询集
如果不是request.user.is_superuser:
queryset=queryset.filter(hospital=request.user)
返回查询集
类PatientSerializer(serializers.ModelSerializer):
医生=过滤器安装工(
slug_field=“name”,
多=假,
allow_null=False
)
类元:
模型=患者
字段=['name','doctor']
Review@matthewhagarty您能在这方面提供更多支持吗?ThanksReview@MatthewHegarty您能在这方面提供更多支持吗?谢谢。正是我想要的。非常感谢你@这真是太棒了。正是我想要的。非常感谢你@普隆斯基
from django.db import models
class Doctor(models.Model):
hospital = models.ForeignKey('auth.User', on_delete=models.CASCADE)
name = models.CharField(primary_key=True, max_length=256, unique=True)
education = models.CharField(max_length=256)
class Patient(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
name = models.CharField(max_length=256)
age = models.CharField(max_length=200)
height = models.CharField(max_length=6)
sex = models.CharField(max_length=12)
from rest_framework import serializers
from .models import Doctor, Patient
class DoctorSerializer(serializers.ModelSerializer):
class Meta:
model = Doctor
fields = [
'name',
'education'
]
class PatientSerializer(serializers.ModelSerializer):
class Meta:
model = Patient
fields = '__all__'
from rest_framework import status, permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Doctor, Patient
from .serializers import DoctorSerializer, PatientSerializer
class DoctorList(APIView):
permission_classes = [permissions.IsAuthenticated]
serializer_class = DoctorSerializer
def get(self, request):
doctors = Doctor.objects.filter(hospital=request.user)
serializer = DoctorSerializer(doctors, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
serializer = DoctorSerializer(data=request.data)
if serializer.is_valid():
serializer.save(hospital=request.user)
return Response({"message": "Doctor inserted!"}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class PatientList(APIView):
permission_classes = [permissions.IsAuthenticated]
serializer_class = PatientSerializer
def get(self, request):
patients = Patient.objects.filter(doctor__hospital=request.user)
serializer = PatientSerializer(patients, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
serializer = PatientSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"message": "Patient inserted!"}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)