Как выполнить фильтрацию в django и vuejs?
В настоящее время у меня есть два поля ввода, одно для фильтрации персонала и фильтрации медицинского пакета на сайте. Я могу фильтровать на основе персонала, но не могу фильтровать на основе медицинского пакета. Я объявил medical_package__in
в filters.py
. Однако при фильтрации по медицинскому пакету результатов все равно нет. Может ли кто-нибудь помочь мне в этом вопросе?
Бэкэнд - filters.py
class StaffMedicalPackageFilter(FilterSet):
staff__in = BaseInFilter(field_name="staff", lookup_expr='in')
staff__username_in = BaseInFilter(field_name="staff__username", lookup_expr='in')
department__in = BaseInFilter(field_name="staff__department", lookup_expr='in')
medical_package__in = BaseInFilter(field_name="medical_package__id", lookup_expr='in')
created_at__gte = DateTimeFilter(field_name="created_at", lookup_expr='gte')
created_at__lt = DateTimeFilter(field_name="created_at", lookup_expr='lt')
class Meta:
model = StaffMedicalPackage
fields = [
'staff',
'staff__in',
'staff__username_in',
'medical_package__in',
'department__in',
'created_at__gte',
'created_at__lt',]
Бэкэнд - view.py
class StaffMedicalPackageList(generics.ListCreateAPIView):
queryset = StaffMedicalPackage.objects.all()
serializer_class = StaffMedicalPackageSerializer
filterset_class = StaffMedicalPackageFilter
permission_classes = [permissions.IsAuthenticated,]
@decorators.api_view(['OPTIONS'])
@decorators.permission_classes([permissions.IsAuthenticated,])
def staffmedicalpackage_filters(request):
result = {
"actions": {
"POST": {
"staff__in": {
"type": "field",
"required": False,
"read_only": True,
"label": "Staff"
},
"medical_package__in": {
"type": "field",
"required": False,
"read_only": False,
"label": "Medical package",
}
}
}
}
return response.Response(result)
Бэкэнд - serializers.py
class StaffMedicalPackageSerializer(serializers.ModelSerializer):
staff_detail = StaffSerializer(read_only=True, source='staff')
medical_package_detail = MedicalPackageSerializer(read_only=True, source='medical_package')
current_year = serializers.ChoiceField(choices = YEARS, source = 'created_at', required=False)
class Meta:
model = StaffMedicalPackage
fields = [
"id",
"created_at",
"updated_at",
"current_year",
"medical_package",
"medical_package_detail",
"staff",
"staff_detail",
'general_balance',
'dental_balance',
'exceeded_amount',]
Frontend - index.vue
methods: {
async getFilters() {
let tmp = await this.api.medical.optionsStaffMedicalPackageFilters();
this.filters = tmp
this.$set(this.filters.staff__in, "item_text", "name")
this.$set(this.filters.staff__in, "item_value", "id")
this.$set(this.filters.staff__in, "read_only", true);
this.$set(this.filters.staff__in, "disabled", true);
this.$set(this.filters.staff__in, "items", await this.api.training.listStaffs({}));
this.$set(this.filters.staff__in, "read_only", false);
this.$set(this.filters.staff__in, "disabled", false);
this.$set(this.filters.medical_package__in, "item_text", "medical_package_name")
this.$set(this.filters.medical_package__in, "item_value", "id")
this.$set(this.filters.medical_package__in, "read_only", true);
this.$set(this.filters.medical_package__in, "disabled", true);
this.$set(this.filters.medical_package__in, "items", await this.api.medical.listMedicalPackage());
this.$set(this.filters.medical_package__in, "read_only", false);
this.$set(this.filters.medical_package__in, "disabled", false);
},
async loadItems() {
let params = {}
for (const property in this.filters) {
if (this.filters[property].hasOwnProperty('value')) {
params[property] = this.filters[property].value
}
}
this.isTableLoading = true;
this.tableData = await this.api.medical.listStaffMedicalPackage(params);
this.isTableLoading = false;
},
getTableHeader() {
this.tableHeaders = [
{ text: 'Staff', value: 'staff_detail' },
{ text: 'Medical Package', value: 'medical_package_detail' },
{ text: 'General Balance (RM)', value: 'general_balance' },
{ text: 'Dental Balance (RM)', value: 'dental_balance' },
{ text: 'Exceeded Amount (RM)', value: 'exceeded_amount' },
{ text: 'Created At', value: 'created_at' },
{ text: 'Updated At', value: 'updated_at' },
{ text: 'Actions', value: 'actions', sortable: false },
];
}