【问题标题】:how to filter field values based on other field values in Django如何根据Django中的其他字段值过滤字段值
【发布时间】:2021-11-03 19:21:33
【问题描述】:

让我们考虑一下我的 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

物品发票

 id    | order_status

  1236  |  1
  1241  |  2
  1241  |  1

最后在一个模式弹出窗口中,我们只需要显示带有 order_status==1 的 invoice_numbers(即 RESERVED )

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    您可以使用以下方式过滤:

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

    因此,我们在这里进行过滤,以便我们仅获得具有相关 item_invoice 且 order_status 等于 1 的 ItemsInvoice 对象。

    我们可以将它传递给模板渲染的上下文,例如:

    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 %}

    【讨论】:

    • 当我以这种方式过滤时,我收到此错误无法将关键字“stockmovements”解析到字段中。选择是:order_status、invoice_number 和导入语句在我的视图中来自 stock.models import StockMovements
    • @VEERABABU:抱歉打错了。应该是固定的。
    • 我仍然收到错误无法将关键字“order_status”解析为字段。
    • @VEERABABU:查询应该在ItemsInvoices 上完成,而不是ItemsAddedInvoice,因此会出现错误。
    • 好的,现在我可以在 django 模板的模态弹出窗口中打印我的 invoice_number
    猜你喜欢
    • 2021-03-29
    • 2021-11-03
    • 2023-03-30
    • 2012-06-27
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多