繁体   English   中英

如何在django中连接模型实例

[英]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.

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