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'),