Могу ли я читать полиморфные модели из одной таблицы базы данных, причем их поведение зависит от (логического) поля модели?
В одной из моих моделей поведение немного отличается, если экземпляр «вперед» против «назад» или «влево» против «вправо». Это приводит к большому количеству if-предложений и дублированию кода. Итак, я хочу иметь прямой и обратный варианты модели, которые инкапсулируют различные варианты поведения.
Но как я могу заставить менеджер моделей возвращать экземпляры нужных классов? Нужно ли перезаписывать __init__
модели?
Может быть, это проще объяснить на примере. Что я делаю:
class Foo(models.Model):
forward = models.BooleanField()
other_fields = ...
def do_foobar(bar):
if self.forward:
gap = bar.end_pos - bar.current_pos
self.do_forward_move(max = gap)
if self.pos==bar.end_pos:
and so on ...
else:
gap = bar.current_pos - bar.start_pos
self.do_backward_move(max = gap)
if self.pos==bar.start_pos:
and so on ...
Что я хочу сделать:
class Foo(models.Model):
forward = models.BooleanField()
other_fields = ...
def __init__(*args, **kwargs):
""" return ForwardFoo or BackwardFoo
depending on the value of 'forward'"""
How?
def do_foobar(bar):
gap = self.calculate_gap(bar)
self.do_move(max = gap)
if self.end_point_reached():
and so on ...
class ForwardFoo(Foo):
def calculate_gap(bar):
return bar.end_pos - bar.current_pos
and so on ...
for f in Foo.objects.all():
f.do_foobar(bar)
Или есть совершенно другой способ избежать такого рода дублирования кода?