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

如何为Django REST的Broadcast模型与序列化器添加标签和运营商码过滤属性

实现Broadcast按Client标签和运营商代码过滤的功能

要实现创建Broadcast时指定过滤条件,按Client的标签或运营商代码筛选目标用户,需要对模型和序列化器做如下修改:

1. 修改models.py中的Broadcast模型

给Broadcast添加存储过滤条件的字段,并实现过滤逻辑:

from django.db import models

class Broadcast(models.Model):
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
    text = models.TextField(max_length=500)
    end_date = models.DateTimeField()
    # 添加过滤字段,允许为空(即不做过滤)
    filter_tag = models.CharField(max_length=50, blank=True, null=True, verbose_name="过滤标签")
    filter_operator_code = models.CharField(max_length=3, blank=True, null=True, verbose_name="过滤运营商代码")

    def __str__(self):
        return self.text

    # 定义方法:获取符合过滤条件的客户端集合
    def get_filtered_clients(self):
        clients = Client.objects.all()
        # 按标签过滤
        if self.filter_tag:
            clients = clients.filter(tag__name=self.filter_tag)
        # 按运营商代码过滤(匹配手机号前4位:7+三位运营商代码)
        if self.filter_operator_code:
            clients = clients.filter(phone__startswith=f"7{self.filter_operator_code}")
        return clients

2. 修改Serializers.py中的BroadcastSerializer

更新序列化器,允许创建Broadcast时传入过滤条件,可选返回筛选后的客户端列表:

from rest_framework import serializers
from .models import Broadcast, Client
from .serializers import ClientSerializer

class BroadcastSerializer(serializers.ModelSerializer):
    end_date = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
    # 可选:返回符合过滤条件的客户端序列化数据(只读)
    filtered_clients = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Broadcast
        fields = ['text', 'end_date', 'filter_tag', 'filter_operator_code', 'filtered_clients']
        read_only_fields = ('date_created', 'date_modified',)

    # 实现获取过滤后客户端的方法
    def get_filtered_clients(self, obj):
        clients = obj.get_filtered_clients()
        return ClientSerializer(clients, many=True).data

补充说明

  • 如果需要支持多标签过滤,可将filter_tag字段改为存储逗号分隔的标签字符串,再修改过滤逻辑:
    def get_filtered_clients(self):
        clients = Client.objects.all()
        if self.filter_tag:
            tag_list = self.filter_tag.strip().split(',')
            clients = clients.filter(tag__name__in=tag_list)
        # 运营商代码过滤逻辑不变
        if self.filter_operator_code:
            clients = clients.filter(phone__startswith=f"7{self.filter_operator_code}")
        return clients
    
  • 创建Broadcast时,可单独传入filter_tag或filter_operator_code,也可同时传入(此时筛选同时满足两个条件的Client);若都不传,则返回所有Client。

内容的提问来源于stack exchange,提问作者Patrick Amaechi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:54:40