I have a specific use case for NumericRange() from psycopg. I need to
both create, two numbers, where lower > upper. I created the following
factory to do that:
class NumericRangeFactory(factory.Factory):
class Meta:
model = NumericRange
class Params:
postgres_max_int =
2147483647 lower_min = 1
lower_max = 100000 + lower_min
upper_min = lower_max + 1
upper_max = postgres_max_int - 1
lower = factory.fuzzy.FuzzyInteger(Params.lower_min, Params.lower_max)
upper = factory.fuzzy.FuzzyInteger(Params.upper_min, Params.upper_max)
bounds = '[]'
It seems that if I want to modify the Params values I just have to pass:
NumericRangeFactory(lower_min=
new_lower,upper_max=new_upper)
except that is just incidental that is between the values:
>>> orig_range = factories.NumericRangeFactory(
)
>>> orig_range
NumericRange(58849, 855059099, '[]')
>>> new_lower = orig_range.lower
>>> new_upper = orig_range.upper
>>> factories.NumericRangeFactory(
lower_min=new_lower,upper_max=
new_upper)
NumericRange(67614, 2010711347, '[]')
>>> factories.NumericRangeFactory(
lower_min=new_lower,upper_max=
new_upper)
NumericRange(84472, 578135953, '[]')
>>> factories.NumericRangeFactory(
lower_min=new_lower,upper_max=
new_upper)
NumericRange(70769, 1875556475, '[]')
>>> factories.NumericRangeFactory(
lower_min=new_lower,upper_max=
new_upper)
NumericRange(57749, 227816600, '[]')
>>> factories.NumericRangeFactory(
lower_min=new_lower,upper_max=
new_upper)
NumericRange(74615, 436612708, '[]')
As can be seen there seems to be no guarantee that later instances would respect
my defined values.
Read a suggestion to override the _create() method with:
@classmethod
def _create(cls, model_class, *args, **kwargs):
lower_min = kwargs.pop('lower_min', None)
lower_max = kwargs.pop('lower_max', None)
upper_min = kwargs.pop('upper_min', None)
upper_max = kwargs.pop('upper_max', None)
obj = super()._create(model_class, *args, **kwargs)
if lower_min is not None or lower_max is not None:
obj.lower = factory.fuzzy.FuzzyInteger(lower_min, lower_max).fuzz()
if upper_min is not None or upper_max is not None:
obj.upper = factory.fuzzy.FuzzyInteger(upper_min, upper_max).fuzz()
if obj.lower and obj.upper and obj.lower > obj.upper:
tmp_lower = obj.lower
tmp_upper = obj.upper
obj.upper = tmp_lower
obj.lower = tmp_upper
return obj
But that also doesn't seem to produce the desired effect either.
In summary, I want to generate a NumericRange with random ranges between some
specific ranges.