首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复模型的django实例

如何修复模型的django实例
EN

Stack Overflow用户
提问于 2020-09-07 17:49:47
回答 2查看 88关注 0票数 0

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

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

我的错误来自于perform_create方法

views.py

代码语言:javascript
复制
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)

models.py

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2020-09-07 19:26:09

这应该是:

代码语言:javascript
复制
def perform_create(self, serializer):
    model_instance = serializer.save(owner=self.request.user)

代码语言:javascript
复制
def perform_create(self, serializer):
    model_instance = serializer.save()
    model_instance.owner = self.request.user

编辑的.仔细看看您的模型,就会发现您需要重新定义模型。正如您所定义的,Patient类下的owner字段指示您可以有一个用户可以是多个病人.(查询:patient=Patient.objects.get(owner=self.request.user)可能返回多个实例。)。建议的模式应是:

代码语言:javascript
复制
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

然后你就可以有自己的观点了:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-09-08 02:55:21

我在过去的24小时里几乎因为这个问题而对编程感到气馁,但是这个社区帮助了我,尽管他们没有给出我所需要的答案,他们让我自己发现了答案,我说谢谢stackoverflow社区.

解决了,我终于发现了我做错了什么。卡片不仅是病人的,也是医院的,所以卡片需要与医院和病人的关系。

models.py

代码语言:javascript
复制
 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

views.py

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63782156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档