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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:04:59