Как добавить свойства фильтра в модель и сериализатор django rest
У меня есть модель клиента и модель трансляции. Модель клиента содержит поле tag и поле operator_code. Я хотел бы иметь свойство filter, чтобы иметь возможность фильтровать по тегам и или operator_code при создании нового объекта вещания.
models.py
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()
def __str__(self):
return self.text
class Client(models.Model):
phoneRegex = RegexValidator(regex='^7[0-9]{10}$')
phone = models.CharField(validators=[phoneRegex], max_length=11, unique=True)
tag = TaggableManager()
def __str__(self):
return self.phone
@property
def operator_code(self):
return self.phone[1:4]
@property
def time_zone(self):
ru_number = phonenumbers.parse(self.phone, 'RU')
time_zone = timezone.time_zones_for_number(ru_number)
return time_zone
Serializers.py
class ClientSerializer(TaggitSerializer, serializers.ModelSerializer):
tag = TagListSerializerField()
time_zone = serializers.SerializerMethodField()
operator_code = serializers.SerializerMethodField()
class Meta:
model = Client
fields = '__all__'
read_only_fields = ('date_created', 'date_modified', 'operator_code', 'time_zone',)
def validate(self, attrs):
phone_number_exists = Client.objects.filter(phone=attrs['phone']).exists()
if phone_number_exists:
raise serializers.ValidationError(detail="phone number exists")
if attrs['phone'][0] != '7':
raise serializers.ValidationError(detail="phone number must start with 7")
if len(attrs['phone']) != 11:
raise serializers.ValidationError(detail="phone number must be 11 digits")
return super().validate(attrs)
def get_operator_code(self, obj):
return obj.operator_code
def get_time_zone(self, obj):
return obj.time_zone
class BroadcastSerializer(serializers.ModelSerializer):
end_date = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
class Meta:
model = Broadcast
fields = ['text', 'end_date',]
read_only_fields = ('date_created', 'date_modified', 'filter_client',)