繁体   English   中英

如何修复模型的 Django 实例

[英]how to fix django instance of a model

错误消息AttributeError: 'NoneType' 对象没有属性 'add'

我正在尝试创建模型的实例。 卡片模型假设是患者模型的一个实例,患者模型与用户模型有外键关系。 就像一个病人在医院里有一张卡。

我的错误来自 perform_create 方法

视图.py

class PatientCardListAPIView(ListCreateAPIView):
    serializer_class = PatientsCardSerializer
    queryset = Card.objects.all()
    permission_classes = (permissions.IsAuthenticated, IsOwner,  ) 
    def perform_create(self, serializer):
        serializer.save()
        serializer.instance.owner.add(self.request.user)

模型.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)    
    owner = models.OneToOneField(Patient, null=True, blank=True, on_delete=models.CASCADE)
    
    def __str__(self):
        return self.name
        
        

它应该是

class PatientCardListAPIView(ListCreateAPIView):
    serializer_class = PatientsCardSerializer
    queryset = Card.objects.all()
    permission_classes = (permissions.IsAuthenticated, IsOwner,)

    def perform_create(self, serializer): serializer.save(owner = self.request.user) 

这应该是:

def perform_create(self, serializer):
    model_instance = serializer.save(owner=self.request.user)

或者

def perform_create(self, serializer):
    model_instance = serializer.save()
    model_instance.owner = self.request.user

已编辑........... 仔细查看您的模型表明您需要重新定义模型。 正如您所定义的,Patient 类下的owner字段表明您可以拥有一个 User 可以是多个 Patient...(查询: patient=Patient.objects.get(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.OneToOneField(User, null=True)**
    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.name

然后你可以有你的看法:

class PatientCardListAPIView(ListCreateAPIView):
    serializer_class = PatientsCardSerializer
    queryset = Card.objects.all()
    permission_classes = (permissions.IsAuthenticated, IsOwner,  ) 
    
    def perform_create(self, serializer):
        card_instance = serializer.save()
        patient = Patient.objects.get(owner=self.request.user)
        card_instance.owner = patient

感谢我几乎用编程的,因为这个问题在过去的24小时气馁,而是这个社会帮助了我,即使他们没有给我所需要的答案,他们把我带进发现自己的答案,和我说谢谢你的StackOverflow社区...

解决了我终于发现我做错了什么。 一张卡不仅属于患者,也属于医院,因此卡需要与医院和患者都有关系。

模型.py

 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)
        hospital = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)        
        def __str__(self):
            return self.name

视图.py

class PatientCardListAPIView(ListCreateAPIView):
    serializer_class = PatientsCardSerializer
    queryset = Card.objects.all()
    permission_classes = (permissions.IsAuthenticated, IsOwner,  )         
    def perform_create(self, serializer):
        return serializer.save(hospital=self.request.user)
    def get_queryset(self):
        return self.queryset.filter(hospital=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(hospital=self.request.user)
            

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM