Django服务启动时读取CSV存入SQLite的代码位置咨询
Hey there! Since you're just starting out with Django, let's break down the best ways to handle this CSV import when you start your server with python manage.py runserver. First off: don't put this logic in a view—here's why and what to do instead:
Views are meant to handle incoming HTTP requests, so putting import logic there would mean it runs every time someone visits that view. That's redundant, could cause duplicate data in your database, and doesn't align with your goal of importing once on server start.
This is the most flexible and maintainable option. You'll create a reusable command that you can run manually, or even automate to run right before runserver.
Step 1: Set up the command structure
In your Django app, create these directories and files (if they don't exist):
your_app/ ├── management/ │ ├── __init__.py │ └── commands/ │ ├── __init__.py │ └── import_csv.py # This will be your command file
Step 2: Write the import command
Open import_csv.py and add this code (adjust it to match your model and CSV structure):
import csv from django.core.management.base import BaseCommand from your_app.models import YourModel # Replace with your actual model class Command(BaseCommand): help = 'Imports data from a CSV file into the SQLite database' def handle(self, *args, **options): # Update this path to your CSV file (use absolute path for reliability) csv_file_path = 'path/to/your/data.csv' try: with open(csv_file_path, 'r', encoding='utf-8') as file: reader = csv.DictReader(file) # Loop through each row and create/update records for row in reader: # Use get_or_create to avoid duplicate entries YourModel.objects.get_or_create( name=row['name'], # Match CSV column names to model fields email=row['email'], # Add other fields as needed ) self.stdout.write(self.style.SUCCESS('✅ CSV data imported successfully!')) except FileNotFoundError: self.stdout.write(self.style.ERROR('❌ CSV file not found at the specified path'))
Step 3: Run the command (and automate it)
- To run manually:
python manage.py import_csv - To automatically run it before starting the server, use a one-liner:
- Windows:
python manage.py import_csv && python manage.py runserver - macOS/Linux:
python manage.py import_csv && python manage.py runserver
- Windows:
If you must have the import happen automatically every time the server starts (without running a separate command), you can use Django's ready() method in your app's config. Just be aware of a caveat: this method might run multiple times in Django's auto-reload mode (the default for runserver), so we'll add a flag to prevent duplicate imports.
Step 1: Modify your app's config
Open your_app/apps.py and update it like this:
from django.apps import AppConfig import csv import os from .models import YourModel class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app' _csv_imported = False # Flag to prevent duplicate imports def ready(self): if not self._csv_imported: # Get the absolute path to your CSV file csv_file_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), '../data.csv' # Adjust relative path as needed ) try: with open(csv_file_path, 'r', encoding='utf-8') as file: reader = csv.DictReader(file) for row in reader: YourModel.objects.get_or_create( name=row['name'], email=row['email'] ) print('✅ CSV data imported on server start!') self._csv_imported = True except FileNotFoundError: print('❌ CSV file not found - skipping auto-import')
Step 2: Register the config
In your_app/__init__.py, add this line:
default_app_config = 'your_app.apps.YourAppConfig'
Caveat
Django's auto-reload mode (enabled by default when running runserver) will trigger ready() twice. The _csv_imported flag fixes this, but keep in mind: if you make code changes and the server reloads, the flag will reset. If that's a problem, stick with the custom command approach.
内容的提问来源于stack exchange,提问作者Elior Sastiel

