Как фильтровать значения полей на основе значений других полей в Django

Давайте рассмотрим мой models.py как

class ItemsInvoices(models.Model):
    RESERVED = 1
    NOT_RESERVED = 2
    ACCEPTED_BY_CUSTOMER = 3
    PO_OR_DEPOSIT_RECEIVED = 4
    DELIVERY_SET = 5
    NOT_READY = 6
    DELIVERED = 7


    ORDER_STATUS = (
        (RESERVED, 'Reserved'),
        (NOT_RESERVED, 'NOT Reserved'),
        (PO_OR_DEPOSIT_RECEIVED, 'Accepted by customer'),
        (PO_OR_DEPOSIT_RECEIVED, 'PO or deposit received'),
        (DELIVERY_SET, 'Delivery set'),
        (NOT_READY, 'Not ready'),
        (DELIVERED, 'Delivered'),
    )
     invoice_number = models.IntegerField(blank=True, null=True)
     order_status = models.IntegerField(default=RESERVED, choices=ORDER_STATUS)

class ItemsAddedInvoice(models.Model):
       item_invoice = models.ForeignKey(ItemsInvoices)

class StockMovements(models.Model):
      item_added_invoice = models.ForeignKey(ItemsAddedInvoice, blank=True, null=True)
      sales_group_id = models.IntegerField(blank=True, null=True)

Здесь на основе идентификатора sales_group_id мне нужно отфильтровать элементы таблицы ItemsInvoices, чей order_status установлен на RESERVED. (Здесь нам нужно фильтровать на основе sales_group_id, потому что для каждого sales_group_id у нас может быть несколько item_added_invoice_id)

Например, рассмотрим таблицу моей базы данных для StockMovements следующим образом:

item_added_invoice_id  |    sales_group_id
 
 2206                  |   1
 2207                  |   1
 2208                  |   2
 2209                  |   3
 2210                  |   4
 2211                  |   4
 2212                  |   4
 2213                  |   5

для ItemsAddedInvoice

 id    | item_invoice_id
    
   2206  |  1236
   2207  |  1236
   2208  |  1236
   2209  |  1236
   2210  |  1236
   2211  |  1241
   2212  |  1241
   2213  |  1242

for ItemsInvoices

 id    | order_status

  1236  |  1
  1241  |  2
  1241  |  1

И, наконец, в модальном всплывающем окне нам просто нужно отобразить номера счетов-фактур с order_status==1 (т.е. RESERVED)

Вы можете фильтровать с помощью:

ItemsInvoices.objects.filter(
    itemsaddedinvoice__stockmovements__sales_group_id=my_group_id,
    order_status=1
).distinct()

Здесь мы фильтруем таким образом, что получаем только ItemsInvoice объекты со связанным item_invoice с order_status равным 1.

Мы можем передать это в контекст рендеринга шаблона, например, с помощью:

def some_view(request):
    invoices = ItemsInvoices.objects.filter(
        itemsaddedinvoice__stockmovements__sales_group_id=my_group_id,
        order_status=1
    ).distinct()
    return render(request, 'some-template.html', {'invoices': invoices})

с some-template.html шаблоном для рендеринга, а в шаблоне затем выведите элементы с:

{% for invoice in invoices %}
    {{ invoice.invoice_number }}
{% endfor %}
Вернуться на верх