Как фильтровать значения полей на основе значений других полей в 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 %}