Python django模型与RESTAPI的关系

Python django模型与RESTAPI的关系,python,django,api,Python,Django,Api,说明 医院是用户,患者属于医院,患者作为对象具有卡片和诊断。 我不知道怎么了,也许是关系,我不知道。我需要帮助 错误消息 输入错误/患者/诊断 调用diagnostics.objects.create()时出现TypeError。这可能是因为序列化程序类中有一个可写字段不是diagnostics.objects.create()的有效参数。您可能需要将该字段设置为只读,或重写patientsdiagnosisserializer.create()方法以正确处理此问题。 最初的例外是: Trac

说明 医院是用户,患者属于医院,患者作为对象具有卡片和诊断。 我不知道怎么了,也许是关系,我不知道。我需要帮助

错误消息 输入错误/患者/诊断 调用
diagnostics.objects.create()
时出现
TypeError
。这可能是因为序列化程序类中有一个可写字段不是
diagnostics.objects.create()
的有效参数。您可能需要将该字段设置为只读,或重写
patientsdiagnosisserializer.create()
方法以正确处理此问题。 最初的例外是:

 Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/rest_framework/serializers.py", line 948, in create
    instance = ModelClass._default_manager.create(**validated_data)
  File "/usr/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python3.8/site-packages/django/db/models/query.py", line 431, in create
    obj = self.model(**kwargs)
  File "/usr/lib/python3.8/site-packages/django/db/models/base.py", line 500, in __init__
    raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
TypeError: Diagnoses() got an unexpected keyword argument 'owner'
患者应用程序的url.py

urlpatterns = [
    path('', views.PatientListAPIView.as_view(), name="patient"),
    path('<int:id>', views.PatientDetailAPIView.as_view(), name="patient"),
    path('card', views.PatientCardListAPIView.as_view(), name="card"),
    path('card/<int:id>', views.PatientCardDetailAPIView.as_view(), name="card"),
    path('diagnoses', views.PatientDiagnosesListAPIView.as_view(), name="diagnoses"),
    path('diagnoses/<int:id>', views.PatientDiagnosesDetailAPIView.as_view(), name="diagnoses")

]
from django.shortcuts import render
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .serializers import PatientsSerializer, PatientsCardSerializer, PatientsDiagnosesSerializer
from .models import Patient
from rest_framework import permissions
from .permissions import IsOwner


# Patient Views
class PatientListAPIView(ListCreateAPIView):
    serializer_class = PatientsSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated, IsOwner,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)


class PatientCardListAPIView(ListCreateAPIView):
    serializer_class = PatientsCardSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientCardDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsCardSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)



class PatientDiagnosesListAPIView(ListCreateAPIView):
    serializer_class = PatientsDiagnosesSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientDiagnosesDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsDiagnosesSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)
from django.db import models
from authentication.models import User
# Create your models here.

class Patient(models.Model):
    name = models.CharField(max_length=255, null=True)
    country = models.CharField(max_length=255, null=True)
    state = models.CharField(max_length=255, null=True)
    phone = models.CharField(max_length=255, null=True)
    email = models.CharField(max_length=255, null=True)
    owner = models.ForeignKey(to=User, null=True, on_delete=models.CASCADE)
    def __str__(self):
        return self.name


class Card(models.Model):    
    name = models.CharField(max_length=255, null=True)
    card_number = models.CharField(max_length=255, null=True)
    patient = models.OneToOneField(Patient, null=True, blank=True, on_delete=models.CASCADE)
    def __str__(self):
        return (self.patient.name)+"'s card"



class Diagnoses(models.Model):
    sickness = models.CharField(max_length=255, null=True)
    note = models.TextField(max_length=255, null=True)   
    patient = models.ForeignKey(Patient, null=True, on_delete=models.SET_NULL)

    def __str__(self):
        return (self.patient.name)+"'s diagnoses"
患者应用程序的views.py

urlpatterns = [
    path('', views.PatientListAPIView.as_view(), name="patient"),
    path('<int:id>', views.PatientDetailAPIView.as_view(), name="patient"),
    path('card', views.PatientCardListAPIView.as_view(), name="card"),
    path('card/<int:id>', views.PatientCardDetailAPIView.as_view(), name="card"),
    path('diagnoses', views.PatientDiagnosesListAPIView.as_view(), name="diagnoses"),
    path('diagnoses/<int:id>', views.PatientDiagnosesDetailAPIView.as_view(), name="diagnoses")

]
from django.shortcuts import render
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .serializers import PatientsSerializer, PatientsCardSerializer, PatientsDiagnosesSerializer
from .models import Patient
from rest_framework import permissions
from .permissions import IsOwner


# Patient Views
class PatientListAPIView(ListCreateAPIView):
    serializer_class = PatientsSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated, IsOwner,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)


class PatientCardListAPIView(ListCreateAPIView):
    serializer_class = PatientsCardSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientCardDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsCardSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)



class PatientDiagnosesListAPIView(ListCreateAPIView):
    serializer_class = PatientsDiagnosesSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientDiagnosesDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsDiagnosesSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)
from django.db import models
from authentication.models import User
# Create your models here.

class Patient(models.Model):
    name = models.CharField(max_length=255, null=True)
    country = models.CharField(max_length=255, null=True)
    state = models.CharField(max_length=255, null=True)
    phone = models.CharField(max_length=255, null=True)
    email = models.CharField(max_length=255, null=True)
    owner = models.ForeignKey(to=User, null=True, on_delete=models.CASCADE)
    def __str__(self):
        return self.name


class Card(models.Model):    
    name = models.CharField(max_length=255, null=True)
    card_number = models.CharField(max_length=255, null=True)
    patient = models.OneToOneField(Patient, null=True, blank=True, on_delete=models.CASCADE)
    def __str__(self):
        return (self.patient.name)+"'s card"



class Diagnoses(models.Model):
    sickness = models.CharField(max_length=255, null=True)
    note = models.TextField(max_length=255, null=True)   
    patient = models.ForeignKey(Patient, null=True, on_delete=models.SET_NULL)

    def __str__(self):
        return (self.patient.name)+"'s diagnoses"
患者应用程序的models.py

urlpatterns = [
    path('', views.PatientListAPIView.as_view(), name="patient"),
    path('<int:id>', views.PatientDetailAPIView.as_view(), name="patient"),
    path('card', views.PatientCardListAPIView.as_view(), name="card"),
    path('card/<int:id>', views.PatientCardDetailAPIView.as_view(), name="card"),
    path('diagnoses', views.PatientDiagnosesListAPIView.as_view(), name="diagnoses"),
    path('diagnoses/<int:id>', views.PatientDiagnosesDetailAPIView.as_view(), name="diagnoses")

]
from django.shortcuts import render
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .serializers import PatientsSerializer, PatientsCardSerializer, PatientsDiagnosesSerializer
from .models import Patient
from rest_framework import permissions
from .permissions import IsOwner


# Patient Views
class PatientListAPIView(ListCreateAPIView):
    serializer_class = PatientsSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated, IsOwner,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)


class PatientCardListAPIView(ListCreateAPIView):
    serializer_class = PatientsCardSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientCardDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsCardSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)



class PatientDiagnosesListAPIView(ListCreateAPIView):
    serializer_class = PatientsDiagnosesSerializer
    queryset = Patient.objects.all()
    permission_classes = (permissions.IsAuthenticated,) 
    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)

class PatientDiagnosesDetailAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = PatientsDiagnosesSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner,)
    queryset = Patient.objects.all()
    lookup_field = "id"
    def get_queryset(self):
        return self.queryset.filter(owner=self.request.user)
from django.db import models
from authentication.models import User
# Create your models here.

class Patient(models.Model):
    name = models.CharField(max_length=255, null=True)
    country = models.CharField(max_length=255, null=True)
    state = models.CharField(max_length=255, null=True)
    phone = models.CharField(max_length=255, null=True)
    email = models.CharField(max_length=255, null=True)
    owner = models.ForeignKey(to=User, null=True, on_delete=models.CASCADE)
    def __str__(self):
        return self.name


class Card(models.Model):    
    name = models.CharField(max_length=255, null=True)
    card_number = models.CharField(max_length=255, null=True)
    patient = models.OneToOneField(Patient, null=True, blank=True, on_delete=models.CASCADE)
    def __str__(self):
        return (self.patient.name)+"'s card"



class Diagnoses(models.Model):
    sickness = models.CharField(max_length=255, null=True)
    note = models.TextField(max_length=255, null=True)   
    patient = models.ForeignKey(Patient, null=True, on_delete=models.SET_NULL)

    def __str__(self):
        return (self.patient.name)+"'s diagnoses"

我在使用POST创建新卡时出错,诊断时也是一样

就是这条路线,对吗

path('card', views.PatientCardListAPIView.as_view(), name="card")
视图如下所示:

class PatientCardListAPIView(ListCreateAPIView):
    serializer_class = PatientsCardSerializer

    def perform_create(self, serializer):
        return serializer.save(owner=self.request.user)
perform\u create()
中,您正在使用参数
owner
调用
serializer.save()
,但是您的
serializer\u类
PatientsCardSerializer
)具有
model=Card
,但该模型没有
owner
列:

class PatientsCardSerializer(serializers.ModelSerializer):  
    class Meta:
        model = Card

因此,您可能不是想在
serializer.save()
中使用
owner
参数,或者您在视图中使用了错误的
serializer\u class

来获取此错误,您正在命中哪个端点,负载是什么样子的?我在使用POST创建新卡时得到了错误,对于诊断也是一样。虽然GET方法有效,但我正在尝试将问题发布到卡片和诊断端点,我在这里发布了一个问题后纠正了这一点。以下是更新问题的链接。随着新的错误,我越来越