#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)