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

如何在Django REST Framework中设计多可选星期几的Schedule模型字段?

Django中实现支持多选星期几的Schedule模型(DRF适配)

下面提供三种实用方案,根据你的数据库类型和业务需求选择:

方案一:使用第三方django-multiselectfield包(通用型)

适合MySQL、SQLite等大多数数据库,实现简单直观。

  1. 安装依赖包:
pip install django-multiselectfield
  1. 修改模型代码:
from django.db import models
from multiselectfield import MultiSelectField

# 定义星期几选项,键为存储值,值为前端显示文本
WEEK_DAYS = (
    (0, '周日'),
    (1, '周一'),
    (2, '周二'),
    (3, '周三'),
    (4, '周四'),
    (5, '周五'),
    (6, '周六'),
)

class Schedule(models.Model):
    name = models.CharField(max_length=100)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    # 多选星期几字段,max_choices可选限制最多选择数量
    week_days = MultiSelectField(choices=WEEK_DAYS, max_choices=7)
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    status = models.BooleanField(default=True)

    def __str__(self):
        return self.name
  1. DRF序列化器适配:
    DRF会自动识别该字段,直接使用ModelSerializer即可,序列化后返回选中的星期几数值列表:
from rest_framework import serializers
from .models import Schedule

class ScheduleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Schedule
        fields = '__all__'

方案二:使用PostgreSQL的ArrayField(仅PostgreSQL可用)

如果项目基于PostgreSQL,可直接用Django内置字段,无需第三方依赖。

  1. 模型代码:
from django.db import models
from django.contrib.postgres.fields import ArrayField

WEEK_DAYS = (
    (0, '周日'),
    (1, '周一'),
    (2, '周二'),
    (3, '周三'),
    (4, '周四'),
    (5, '周五'),
    (6, '周六'),
)

class Schedule(models.Model):
    name = models.CharField(max_length=100)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    # 存储整数类型的星期几数组,默认空列表
    week_days = ArrayField(models.IntegerField(choices=WEEK_DAYS), default=list)
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    status = models.BooleanField(default=True)

    def __str__(self):
        return self.name
  1. DRF序列化器适配:
    默认返回数值列表,也可自定义字段转换为显示名称:
from rest_framework import serializers
from .models import Schedule, WEEK_DAYS

# 自定义字段:将数值转换为星期几名称
class WeekDayField(serializers.Field):
    def to_representation(self, value):
        day_map = dict(WEEK_DAYS)
        return [day_map[day] for day in value]

    def to_internal_value(self, data):
        day_map = {v: k for k, v in dict(WEEK_DAYS).items()}
        try:
            return [day_map[day] for day in data]
        except KeyError:
            raise serializers.ValidationError("无效的星期几名称")

class ScheduleSerializer(serializers.ModelSerializer):
    week_days = WeekDayField()

    class Meta:
        model = Schedule
        fields = '__all__'

方案三:使用ManyToManyField(扩展型)

适合需要给星期几添加额外属性(如特殊描述)的场景,需单独创建星期几模型。

  1. 模型代码:
from django.db import models

class WeekDay(models.Model):
    name = models.CharField(max_length=10)
    day_number = models.IntegerField(unique=True)  # 0=周日,1=周一...

    def __str__(self):
        return self.name

class Schedule(models.Model):
    name = models.CharField(max_length=100)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    week_days = models.ManyToManyField(WeekDay)
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    status = models.BooleanField(default=True)

    def __str__(self):
        return self.name
  1. DRF序列化器适配:
    可选择返回主键或显示名称:
from rest_framework import serializers
from .models import Schedule, WeekDay

class ScheduleSerializer(serializers.ModelSerializer):
    # 显示星期几名称
    week_days = serializers.StringRelatedField(many=True)
    # 或者返回主键:week_days = serializers.PrimaryKeyRelatedField(many=True, queryset=WeekDay.objects.all())

    class Meta:
        model = Schedule
        fields = '__all__'

内容的提问来源于stack exchange,提问作者Alex Advent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:01:24