Решение для комбинаций типов элементов, когда любой из типов может иметь нулевые элементы - PullRequest
0 голосов
/ 31 января 2019

У меня есть 3 Модели / Сущности, A, B, C (бэкэнд - django).

На внешнем интерфейсе у меня есть 3 пустых поля, в которые мне нужно добавить экземпляры A, B, C.Количество доступных экземпляров для A, B, C может быть от 0 до бесконечности.

В идеале я должен показать 1 из A, 1 из B и 1 из C, но иногда у любой из сущностей не может быть экземпляров.,Не может быть ни одного, ни одного, ни нескольких без экземпляров.

Мой базовый подход заключается в использовании ifs, но это неэффективно, см. Только одну из ветвей в псевдокоде:

if not C:
   if A:
      if not B:
         show up to 3 of A if they are available
      elif B:
        if at least 2 of A:
          show 2 of A and 1 Of B
        if 1 of A:
          show 1 of A and up to 2 of B
   elif not A:
      show up to 3 of B if exist  

Помимо десятков ifs во всех ветвях, он не масштабируется, например, если я добавлю новую сущность и / или поле в будущем.

Итак, я ищу алгоритмэто может масштабироваться.Я использую Python, Django, PostgreSQL.Я извлекаю данные, просто:

A.objects.all().order_by('-id')[:3]

1 Ответ

0 голосов
/ 31 января 2019
models = [A, B, C]
num_boxes = len(models)  # but could be different
objects = [list(model.objects.all().order_by('-id')[:num_boxes])
           for model in models]
boxes = []

while any(objects):
    for row in objects:
        if row:
            boxes.append(row.pop(0))

print(sorted(
    boxes[:num_boxes],
    key=lambda x: models.index(type(x))
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...