как исправить экземпляр django модели

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

Сообщение об ошибке AttributeError: объект ‘NoneType’ не имеет атрибута ‘add’

пытаюсь создать экземпляр модели. предполагается, что модель card является экземпляром модели пациента, а модель пациента имеет отношения внешнего ключа с моделью пользователя. Это похоже на пациента, у которого есть карточка в больнице.

Моя ошибка исходит из метода perform_create

views.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)
  

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

Ответ №1:

Это должно быть как

 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)
          

Комментарии:

1. Я проверил это сейчас, и у меня такая же ошибка………….. строка 48 в perform_create model_instance. owner.add(self.request.user) Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘add’

2. @JosephAyemlo обновил ответ

Ответ №2:

Это должно быть:

 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
  

Отредактировано
…………..
Более пристальный взгляд на вашу модель показывает, что вам нужно переопределить модель. Как вы определили, поле owner в классе 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
  

Комментарии:

1. TypeError: save() принимает 1 позиционный аргумент, но было задано 2

2. Ошибка значения: не удается назначить «<Пользователь: user00@example.com >»: «Card.owner» должен быть экземпляром «Пациента».

Ответ №3:

Благодарность Из-за этой проблемы я был почти обескуражен программированием в течение последних 24 часов, но это сообщество помогло мне, хотя они и не дали нужного мне ответа, они привели меня к поиску ответа самостоятельно, и я говорю спасибо сообществу stackoverflow…

Решаемая Я наконец обнаружил, что я делал неправильно. карточка не просто принадлежит пациенту, она также принадлежит больнице, поэтому карта должна иметь отношение как к больнице, так и к пациенту.

models.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
  

views.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)