Django как написать однообъектный запрос в моей функции exportcsv?

Я пишу эту функцию для экспорта файла csv. Я использую этот запрос patient = Patient.objects.all() для экспорта всех объектов. Но у меня есть страница подробностей для каждого объекта, и я хочу экспортировать каждый объект по отдельности со страницы подробностей. как написать запрос для получения отдельного объекта?

вот мой код:

models.py

class Patient(models.Model):
      patient_name = models.CharField(max_length=150)
      patient_id = models.CharField(max_length=100,blank=True,null=True)
      date_of_birth = models.DateField()
      age = models.CharField(max_length=100,blank=True,null=True)
      phone =  models.CharField(max_length=100)
      email = models.EmailField(blank=True,null=True)
      slug = models.SlugField(max_length=255,unique=True,blank=True,null=True)

views.py

    def exportcsv(request): #I am exporting csv file from this view
        response = HttpResponse(content_type='text/csv') 
        response ['Content-Disposition'] = 'attachment; filename=PatientData'+str(datetime.datetime.now())+'.csv'
    
        writer = csv.writer(response)
        writer.writerow(['patient_name'])
        
        patient = Patient.objects.all()
    
        for i in patient:
            print(i.patient_name)
            writer.writerow([i.patient_name])
        return response

#this view for showing details info of each items
class PatientDeleteView(DeleteView):
      model = Patient 
      template_name = 'hospital/patient-delete.html'

      def get_context_data(self, **kwargs):
            data = super().get_context_data(**kwargs)
            messages.add_message(self.request, messages.INFO, 'Patient Deleted Sucessfully')
            return data
       
      success_url = reverse_lazy('hospital:all-patient')

#urls.py

 path('export-csv-patient-data/',views.exportcsv,name='export-csv-patient-data'),
 path('<slug:slug>/patient-details/',PatientDetails.as_view(),name='patient-details'),

Теперь он загружает все объекты, которые я хочу, он будет загружать только отдельные объекты со страницы подробностей.

Необходимо определить, с какой страницы вы переходите при вызове этого представления. Один из подходов может заключаться в разборе query_params при вызове этого представления. Например:

Ссылка на экспорт на вашей странице подробностей:

/patient_name/export-csv-patient-data/?details=True

и в вашем представлении exportcsv:

def exportcsv(request):
    details = request.query_params.get('details')

    ...

    if details:
        # Do the stuff for the details export
    else:
        # Do the stuff for the all patients export

Вы можете добавить еще один путь для загрузки всех данных пациента следующим образом:

urls.py

path('export-csv-patient-data/',views.exportcsv,name='export-csv-patient-data'),
path('export-csv-patient-data/<slug:patient_slug>/',views.exportcsv,name='export-csv-patient-data')
# I have moved slug parameter to end instead of start as that is the convention and have also gave it a meaningful name

views.py

def exportcsv(request, patient_slug=None):
   # rest of the code
   patient_names = Patient.objects.filter(slug=patient_slug).values_list('patient_name', flat=True) if patient_slug else Patient.objects.values_list('patient_name', flat=True)
   for patient_name in patient_names:
       writer.writerow([patient_name])

   return Response
       

Наконец-то я нашел одно из самых простых решений. Я просто добавил еще один параметр url без slug в urls.py. вот мой код:

patient = Patient.objects.filter(slug=slug) #this query for slug url 
all_patient = Patient.objects.all() #this query for non slug url 
    
for i in patient: #this for loop will run for slug url
                   writer.writerow([i.patient_id,i.patient_name,i.date_of_birth,i.age,i.phone,i.email,i.gender,i.country,i.state,i.city,i.zip_code,i.address])

if slug == None: #this for loop only running for non slug url
            for i in all_patient:
                writer.writerow([i.patient_id,i.patient_name,i.date_of_birth,i.age,i.phone,i.email,i.gender,i.country,i.state,i.city,i.zip_code,i.address])

uls.py теперь просто добавил еще один url без slug.

 path('export-csv-patient-data/<slug:slug>/',views.exportcsv,name='export-csv-patient-data'),
 path('export-csv-all-data/',views.exportcsv,name='export-csv-all-data'),
Вернуться на верх