如何为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
相关产品推荐
相关产品推荐

