如何在Django中关联已有数据的Employee与Product模型?
为Django的Employee和Product模型建立关联实现分配与数据检索
1. 修改模型添加关联字段
根据实际业务需求,选择以下两种关联方式之一:
选项1:一对多关联(支持一个员工分配多台设备)
在Product模型中添加外键关联到Employee,这样一台设备只能归属一个员工,一个员工可以拥有多台设备:
from django.db import models from django.utils import timezone class Employee(models.Model): address = models.EmailField(max_length=100,null=True) first_name = models.CharField(max_length=50,null=True) sec_name = models.CharField(max_length=50,null=True) department = models.CharField(max_length= 50,null=True) company = models.CharField(max_length= 50,null=True) date_created = models.DateTimeField(default=timezone.now) date_updated = models.DateTimeField(auto_now=True) def __str__(self): return self.first_name + ' - ' + self.department class Product(models.Model): model=models.CharField(max_length=50, null=True) serial=models.CharField(max_length=50, null=True) hd_size=models.CharField(max_length=50,null=True) ram=models.CharField(max_length=50, null=True) processor=models.CharField(max_length=50, null=True) # 新增关联字段 employee = models.ForeignKey( Employee, on_delete=models.SET_NULL, null=True, blank=True, related_name='assigned_products' ) date_created = models.DateTimeField(default=timezone.now) date_updated = models.DateTimeField(auto_now=True) def __str__(self): return self.serial + ' - ' + self.model
选项2:一对一关联(一个员工仅分配一台设备)
如果每个员工只能对应一台设备,在Employee模型中添加一对一字段:
from django.db import models from django.utils import timezone class Employee(models.Model): address = models.EmailField(max_length=100,null=True) first_name = models.CharField(max_length=50,null=True) sec_name = models.CharField(max_length=50,null=True) department = models.CharField(max_length= 50,null=True) company = models.CharField(max_length= 50,null=True) # 新增一对一关联字段 assigned_product = models.OneToOneField( Product, on_delete=models.SET_NULL, null=True, blank=True, related_name='assigned_to' ) date_created = models.DateTimeField(default=timezone.now) date_updated = models.DateTimeField(auto_now=True) def __str__(self): return self.first_name + ' - ' + self.department class Product(models.Model): model=models.CharField(max_length=50, null=True) serial=models.CharField(max_length=50, null=True) hd_size=models.CharField(max_length=50,null=True) ram=models.CharField(max_length=50, null=True) processor=models.CharField(max_length=50, null=True) date_created = models.DateTimeField(default=timezone.now) date_updated = models.DateTimeField(auto_now=True) def __str__(self): return self.serial + ' - ' + self.model
2. 执行数据库迁移
由于新增的关联字段设置了null=True和blank=True,不会破坏现有数据表中的数据,直接运行以下命令完成迁移:
python manage.py makemigrations python manage.py migrate
3. 为员工分配产品
通过Django Shell快速分配
打开Django交互Shell:
python manage.py shell
根据关联类型执行分配操作:
一对多场景:
# 获取目标员工和产品 employee = Employee.objects.get(id=1) product = Product.objects.get(id=1) # 将产品分配给员工 product.employee = employee product.save()
一对一场景:
employee = Employee.objects.get(id=1) product = Product.objects.get(id=1) # 将产品分配给员工 employee.assigned_product = product employee.save()
在视图中通过表单分配
可以结合表单实现页面端的分配操作,示例视图代码:
from django.shortcuts import get_object_or_404, redirect from .models import Employee, Product def assign_product(request, employee_id, product_id): employee = get_object_or_404(Employee, id=employee_id) product = get_object_or_404(Product, id=product_id) # 一对多场景使用此行 product.employee = employee # 一对一场景请替换为:employee.assigned_product = product product.save() return redirect('employee_detail', id=employee_id)
4. 检索与展示关联数据
后台检索数据
一对多场景:
- 获取某员工的所有分配设备:
employee = Employee.objects.get(id=1) assigned_products = employee.assigned_products.all()
- 获取某设备所属的员工:
product = Product.objects.get(id=1) related_employee = product.employee
一对一场景:
- 获取某员工的分配设备:
employee = Employee.objects.get(id=1) assigned_product = employee.assigned_product
- 获取某设备对应的员工:
product = Product.objects.get(id=1) related_employee = product.assigned_to
前端模板展示
一对多场景展示模板:
{% for employee in employees %} <div class="employee-item"> <h3>{{ employee.first_name }} {{ employee.sec_name }}</h3> <p>部门:{{ employee.department }}</p> <h4>已分配设备:</h4> {% for product in employee.assigned_products.all %} <p>型号:{{ product.model }} | 序列号:{{ product.serial }} | 处理器:{{ product.processor }}</p> {% empty %} <p>暂无分配设备</p> {% endfor %} </div> {% endfor %}
一对一场景展示模板:
{% for employee in employees %} <div class="employee-item"> <h3>{{ employee.first_name }} {{ employee.sec_name }}</h3> <p>部门:{{ employee.department }}</p> {% if employee.assigned_product %} <h4>已分配设备:</h4> <p>型号:{{ employee.assigned_product.model }} | 序列号:{{ employee.assigned_product.serial }}</p> {% else %} <p>暂无分配设备</p> {% endif %} </div> {% endfor %}
内容的提问来源于stack exchange,提问作者David Mutuku
相关产品推荐
相关产品推荐

