如何修复django模型实例
错误消息 ValueError:无法分配“”:“Diagnostics.owner”必须是“Patient”实例 当我尝试创建新卡或诊断时,会出现上述错误。 卡片和诊断意味着是患者的一个实例,就像患者拥有卡片和诊断的方式一样。patient类有一个引用用户的foregin键。 这是密码 视图.py如何修复django模型实例,django,django-models,django-rest-framework,django-views,Django,Django Models,Django Rest Framework,Django Views,错误消息 ValueError:无法分配“”:“Diagnostics.owner”必须是“Patient”实例 当我尝试创建新卡或诊断时,会出现上述错误。 卡片和诊断意味着是患者的一个实例,就像患者拥有卡片和诊断的方式一样。patient类有一个引用用户的foregin键。 这是密码 视图.py from django.shortcuts import render from rest_framework.generics import ListCreateAPIView, Retri
from django.shortcuts import render
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .serializers import PatientsSerializer, PatientsCardSerializer, PatientsDiagnosesSerializer
from .models import Patient, Card, Diagnoses
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 = Card.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 = Card.objects.all()
lookup_field = "id"
def get_queryset(self):
return self.queryset.filter(owner=self.request.user)
class PatientDiagnosesListAPIView(ListCreateAPIView):
serializer_class = PatientsDiagnosesSerializer
queryset = Diagnoses.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 = Diagnoses.objects.all()
lookup_field = "id"
def get_queryset(self):
return self.queryset.filter(owner=self.request.user)
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)
owner = 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)
owner = models.ForeignKey(Patient, null=True, on_delete=models.SET_NULL)
def __str__(self):
return (self.patient.name)+"'s diagnoses"
型号.py
from django.shortcuts import render
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .serializers import PatientsSerializer, PatientsCardSerializer, PatientsDiagnosesSerializer
from .models import Patient, Card, Diagnoses
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 = Card.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 = Card.objects.all()
lookup_field = "id"
def get_queryset(self):
return self.queryset.filter(owner=self.request.user)
class PatientDiagnosesListAPIView(ListCreateAPIView):
serializer_class = PatientsDiagnosesSerializer
queryset = Diagnoses.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 = Diagnoses.objects.all()
lookup_field = "id"
def get_queryset(self):
return self.queryset.filter(owner=self.request.user)
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)
owner = 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)
owner = models.ForeignKey(Patient, null=True, on_delete=models.SET_NULL)
def __str__(self):
return (self.patient.name)+"'s diagnoses"
到目前为止,
self.request.user
是一个user
对象。因此,无法将其保存到API或保存到模型。为清楚起见,它不是患者对象
根据您的情况,我会将Patient
对象与User
对象(如果这是单向引用对象)一起排队,并将其放入参数中,然后执行save()方法
class PatientCardListAPIView(ListCreateAPIView):
serializer\u class=PatientsCardSerializer
queryset=Card.objects.all()
权限\类=(permissions.IsAuthenticated,)
def执行_创建(自、序列化程序):
getPatientFromUser=Patient.objects.get(所有者=self.request.user)
#getPatientFromUser返回'Patient'实例。所以你可以把它绑在“卡片”模型里。
返回serializer.save(所有者=getPatientFromUser)
def get_queryset(自我):
返回self.queryset.filter(所有者=self.request.user)
注:
用户
被称为患者)User
和Patience
之间存在交叉引用关系(其中User和Patience彼此有外键),则声明您的用户
模型向我们展示用于创建实例的代码。模型没有问题。应该是在执行时出现问题。我们添加了创建实例的代码。我编辑了这篇文章并添加了视图。py我有几个问题,1)回溯是否会导致
views.py
???2.)此外,User
不是Patience
,因此您不能仅仅依赖User
实例,除非User
与Patience
有交叉引用。如果存在交叉引用,我们可以通过将其重定向到该对象来解决它。如果您只有单向引用,我建议将该对象User
查询到Patience
。我可以回答,但让我们看看你会怎么做。这是我已经看到的患者模型,我的意思是返回serializer.save(owner=self.request.user)
<代码>自我请求。用户不是患者对象。它是一个用户对象。因此它会发出错误。我建议将此用户
对象查询到患者
对象。为了以防万一,我可能会把这个答案和其他上下文放在一起。对不起,我该如何声明选项2Oh的用户模型,我以为您明确声明了User
,我想现在您可以选择单向引用。您可以用子类AbstractBaseUser
或AbstractUser
声明您的User
类。但这需要重新声明用户字段。这意味着它将更加可定制,但您必须自己声明字段。有关这些类的更多信息,请查看文档。如果您现在不打算更改用户
模型,那么我建议使用我从上面提供的单向参考解决方案。(如果这似乎足够,请将其标记为已接受答案)当我提示您在此处给出的第一个选项时,您在/patient/card get()返回的多个对象返回了一个以上的患者,返回了3!