【问题标题】:django model relationship with rest apidjango模型与rest api的关系
【发布时间】:2020-12-25 10:16:07
【问题描述】:

说明 医院是用户,病人属于医院,病人作为对象有卡,有诊断。 我不知道出了什么问题,也许是关系,我不知道。我需要帮助

错误信息 /患者/诊断处的类型错误 拨打Diagnoses.objects.create() 时收到TypeError。这可能是因为您在序列化程序类上有一个可写字段,它不是Diagnoses.objects.create() 的有效参数。您可能需要将该字段设为只读,或覆盖 PatientsDiagnosesSerializer.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'

患者应用的 urls.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")

]

serializers.py

from rest_framework import serializers
from .models import Patient, Card, Diagnoses


class PatientsSerializer(serializers.ModelSerializer):   
    class Meta:
        model = Patient
        fields = ['id', 'name', 'phone', 'email', 'state','country']

class PatientsCardSerializer(serializers.ModelSerializer):  
    class Meta:
        model = Card
        fields = ['id', 'name', 'card_number']

class PatientsDiagnosesSerializer(serializers.ModelSerializer): 
    class Meta:
        model = Diagnoses
        fields = ['id', 'sickness', 'note']

患者应用的views.py

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)

患者应用的models.py

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"

【问题讨论】:

  • 得到这个错误,你打的是哪个端点,payload是什么样子的?
  • 我在使用 POST 创建新卡时遇到错误,诊断也是如此。虽然 GET 方法工作正常
  • 我正在尝试 POST 到卡并诊断端点

标签: python django api


【解决方案1】:

我在使用 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_create() 中,您使用参数owner 调用serializer.save(),但您的serializer_class (PatientsCardSerializer) 具有model = Card,但该模型没有owner 列:

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

所以你要么不想在serializer.save() 中使用owner 参数,要么在视图中使用了错误的serializer_class

【讨论】:

猜你喜欢
  • 2022-01-27
  • 2014-01-22
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多