与Django中的自定义表的多对多关系

时间:2020-02-24 14:57:40

标签: django django-views

我有两个与自定义表(如Clinic和Doctor)以及自定义表DoctorClinic有许多关系的模型。 如何获得基于诊所的医生名单? 这是我的views.py

class ClinicDetailView(generic.DetailView):
    model = Clinic
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['doctor_list'] = self.doctor_set.annotate(
        shift=F('doctor_list__shift'),
        timming=F('doctor_list__timming')
        return context

我收到错误对象没有属性Doctor_set 这是我的模型。py

class Clinic(models.Model):
    name  = models.CharField(max_length = 256)
    area = models.ForeignKey(Area, on_delete=models.CASCADE,default=None,null=True)
    city = models.ForeignKey(City, on_delete=models.CASCADE,default=None,null=True)
    address = models.TextField()
    contact = models.CharField(max_length = 18)
    category = models.CharField(max_length=30,choices = CHTYPE)
    lat = models.FloatField()
    lon = models.FloatField()

class Doctor(models.Model):
    name =  models.CharField(max_length = 256)
    speciality = models.CharField(max_length = 256)
    contact = models.CharField(max_length = 12)
    speciality = models.ForeignKey(Speciality, on_delete=models.CASCADE)
    clinic_hospital = models.ManyToManyField(Clinic, through='DoctorHospital')

class DoctorHospital(models.Model):
    clinic = models.ForeignKey(ClinicHospital, on_delete=models.CASCADE)
    doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
    shift = models.CharField(max_length=10)
    # time_from = models.DateTimeField(auto_now_add=False,blank=True)
    # time_to = models.DateTimeField( auto_now_add=False,blank=True)
    timing = models.CharField(max_length=20,blank=True)

这是我的urls.py

path('clinichospital/<int:pk>/',views.ClinicHospitalDetailView.as_view(),name = 'clinichospital_detail')

请帮助我如何显示我的医生清单。

1 个答案:

答案 0 :(得分:0)

尝试一下:

class ClinicDetailView(generic.DetailView):
model = Clinic
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    client_id = self.kwargs['pk'] # Pull id out of url
    client = Client.objects.get(id=client_id)
    context['doctor_list'] = client.doctor_set.annotate(
        shift=F('doctor_list__shift'),
        timming=F('doctor_list__timming') 
    ) # Missing bracket
    return context