[英]how to connect model instance in django
代码说明
我有一个名为 Hospital 的模型,它是与用户模型具有 OneToOne 关系的用户。 医院模型就像用户的个人资料。 我有另一个称为患者的模型,它与用户有一个 Foreginkey 关系,就像一对多的关系。 这意味着用户模型可以有很多耐心。 我有另一个名为 Card 的模型,它与患者有 OnoToOne 关系,与用户模型有外键关系。 这意味着患者可以拥有一张卡,而该特定卡只能属于一名患者,而且该卡属于医院而不仅仅是患者,这就是为什么我为与用户模型的关系添加了外键。 我有另一个名为 Diagnoses 的模型,它也与 PatientModel 有 ForiegnKey 关系,与 User 模型有外键关系,因为诊断不仅适用于患者,而且适用于医院。 这意味着患者有一张卡片,并且可以进行多种诊断。
使用这种方法,成功地,一个用户可以有很多耐心。 现在我的问题是,当用户想要为特定患者创建新卡或诊断时,患者将如何与卡或诊断相关联,导致没有字段将该卡或诊断绑定到患者。 可以成功创建卡或诊断,但无法选择卡或诊断属于哪个患者。
Heroku 链接到托管版本https://digirv1.herokuapp.com/
代码
视图.py
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)
# Card Views
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)
# Diagnoses Views
class PatientDiagnosesListAPIView(ListCreateAPIView):
serializer_class = PatientsDiagnosesSerializer
queryset = Diagnoses.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 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(hospital=self.request.user)
模型.py
class Hospital(models.Model):
user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
name = models.CharField(max_length=255, null=True, default="Hospital Name")
country = models.CharField(max_length=255, null=True)
state = models.CharField(max_length=255, null=True)
city = models.CharField(max_length=255, null=True)
postal_code = models.CharField(max_length=255, null=True)
phone = models.CharField(max_length=255, null=True)
email = models.CharField(max_length=255, null=True)
reg_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
#hospital created on account verification just with this signals no need for additional config
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Hospital.objects.create(user=instance)
print("hospital created")
@receiver(post_save, sender=User)
def update_profile(sender, instance, created, **kwargs):
if created == False:
instance.hospital.save()
print('hospital updated')
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
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, blank=True, on_delete=models.CASCADE)
hospital = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
def __str__(self):
return self.sickness
网址.py
urlpatterns = [
path('', views.PatientListAPIView.as_view(), name="patient"),
path('<int:id>', views.PatientDetailAPIView.as_view(), name="patient"),
path('card', views.PatientCardListAPIView.as_view(), name="card"),
path('card/<int:id>', views.PatientCardDetailAPIView.as_view(), name="card"),
path('diagnoses', views.PatientDiagnosesListAPIView.as_view(), name="diagnoses"),
path('diagnoses/<int:id>', views.PatientDiagnosesDetailAPIView.as_view(), name="diagnoses")
]
请为您希望患者访问的模型添加外键。
首先在 DiagnosesSerializer 的序列化器字段中包含外键:
class PatientsDiagnosesSerializer(serializers.ModelSerializer):
class Meta:
model = Diagnoses
fields = ['id', 'sickness', 'note', 'owner', 'hospital']
然后查看这篇文章: Django REST - 使用序列化程序创建带有外键的对象它应该可以解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.