如何修复django模型实例

如何修复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

错误消息 ValueError:无法分配“”:“Diagnostics.owner”必须是“Patient”实例

当我尝试创建新卡或诊断时,会出现上述错误。 卡片和诊断意味着是患者的一个实例,就像患者拥有卡片和诊断的方式一样。patient类有一个引用用户的foregin键。 这是密码

视图.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"
型号.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!