You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据URL传入的ID过滤Rfid模型字段,生成CSV文件?

Solution: Filter Rfid Entries by URL Parameter and Export to CSV

Got it, let's tackle this problem step by step. You want to modify your existing CSV export view to filter the Rfid model based on a URL parameter id—where id=1 returns entries with vrata1=True, and id=2 returns those with vrata2=True. Here's how to implement this cleanly:

1. Confirm Your Rfid Model (for reference)

Assuming your model looks like this (you mentioned the boolean fields already):

from django.db import models

class Rfid(models.Model):
    vrata1 = models.BooleanField(default=False, verbose_name="Vrata 1")
    vrata2 = models.BooleanField(default=False, verbose_name="Vrata 2")
    vrata3 = models.BooleanField(default=False, verbose_name="Vrata 3")
    # Add your other fields here (e.g., timestamp, rfid_tag, etc.)

    class Meta:
        verbose_name_plural = "RFID Entries"

2. Update the CSV Export View

We'll create a class-based view that handles the URL parameter, filters the queryset dynamically, and generates the CSV response. We'll also handle invalid id values gracefully.

Option 1: Basic CSV Export View

This works well for small to medium datasets:

from django.http import HttpResponse
from django.views import View
from .models import Rfid
import csv

class RfidCSVExportView(View):
    def get(self, request, id, *args, **kwargs):
        # Map the URL id to the corresponding model field
        filter_mapping = {
            1: 'vrata1',
            2: 'vrata2'
            # Add 3: 'vrata3' later if needed
        }

        # Get the field to filter, or handle invalid id
        filter_field = filter_mapping.get(id)
        if not filter_field:
            # Return an error CSV if id is invalid
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename="invalid_filter.csv"'
            writer = csv.writer(response)
            writer.writerow(['Error', 'Invalid ID parameter. Use 1 or 2.'])
            return response

        # Filter the queryset to get only entries where the field is True
        queryset = Rfid.objects.filter(**{filter_field: True})

        # Prepare the CSV response
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = f'attachment; filename="rfid_{filter_field}_true.csv"'

        # Create a CSV writer
        writer = csv.writer(response)

        # Write the header row (customize with your actual fields)
        writer.writerow([
            'ID',
            'Vrata 1',
            'Vrata 2',
            'Vrata 3'
            # Add other field headers here
        ])

        # Write data rows
        for entry in queryset:
            writer.writerow([
                entry.id,
                'Yes' if entry.vrata1 else 'No',
                'Yes' if entry.vrata2 else 'No',
                'Yes' if entry.vrata3 else 'No'
                # Add other field values here
            ])

        return response

Option 2: Streaming CSV for Large Datasets

If you expect thousands of entries, use StreamingHttpResponse to avoid loading all data into memory at once:

from django.http import StreamingHttpResponse
from django.views import View
from .models import Rfid
import csv

class Echo:
    """Helper class to simulate a buffer for streaming."""
    def write(self, value):
        return value

class RfidCSVStreamExportView(View):
    def get(self, request, id, *args, **kwargs):
        filter_mapping = {1: 'vrata1', 2: 'vrata2'}
        filter_field = filter_mapping.get(id)

        if not filter_field:
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename="invalid_filter.csv"'
            writer = csv.writer(response)
            writer.writerow(['Error', 'Invalid ID parameter. Use 1 or 2.'])
            return response

        queryset = Rfid.objects.filter(**{filter_field: True})

        # Set up streaming response
        pseudo_buffer = Echo()
        writer = csv.writer(pseudo_buffer)

        # Generate header and data rows
        header = ['ID', 'Vrata 1', 'Vrata 2', 'Vrata 3']
        data_rows = (
            [
                entry.id,
                'Yes' if entry.vrata1 else 'No',
                'Yes' if entry.vrata2 else 'No',
                'Yes' if entry.vrata3 else 'No'
            ]
            for entry in queryset
        )

        # Combine header and data into a single stream
        stream = [header] + list(data_rows)

        response = StreamingHttpResponse(
            (writer.writerow(row) for row in stream),
            content_type='text/csv'
        )
        response['Content-Disposition'] = f'attachment; filename="rfid_{filter_field}_true.csv"'
        return response

3. Configure the URL Pattern

Add this to your urls.py to map the URL with the id parameter to your view:

from django.urls import path
from .views import RfidCSVExportView  # Or RfidCSVStreamExportView

urlpatterns = [
    # Your other URLs...
    path('export-rfid-csv/<int:id>/', RfidCSVExportView.as_view(), name='export_rfid_csv'),
]

Key Notes

  • Dynamic Filtering: We use a filter_mapping dictionary to map the URL id to the model field, which keeps the code clean and easy to extend (just add more entries to the dict if you need to support vrata3 later).
  • Invalid Parameter Handling: We return a CSV with an error message instead of a generic 404, so the user gets clear feedback.
  • Customization: Adjust the header rows and data rows to include all the fields from your Rfid model that you want in the CSV.

内容的提问来源于stack exchange,提问作者Domen Preložnik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:53:57