使用 Django 根据用户选择的另一个对象属性的值来过滤属性的对象值

Posted

技术标签:

【中文标题】使用 Django 根据用户选择的另一个对象属性的值来过滤属性的对象值【英文标题】:Using Django to filter object values of an attribute based on user-selected values of another object attribute 【发布时间】:2021-01-19 07:51:55 【问题描述】:

我有 3 张表,分别是 item、shop 和 stock

item table consists of 
item_id    item_name     item_price
1          drug AJG         32.00
2          drug BOLS        10.00 
3          drug CPP         5.00
4          drug C77         55.00
5          drug CLIMO       13.00 

shop table consists of
shop_id    shop_name       shop_country
3          ABC Clinic      Australia
4          FYZ Hospital    New Zealand
5          HH Pharmacy     Spain
22         SAJ Clinic      Portugal
33         PO Pharmacy     Portugal

stock table consists of
shop_id    item_id     stock_qty
3          1           22  
4          2           45 
5          3           11
22         4           39
33         5           66

我使用 Django 构建了 Web 应用程序,允许用户使用以下代码输入 item_name(即药物 A)和 shop_name(ABC 诊所)。到目前为止,我有一个能够基于正则表达式显示商品名称和商店名称的功能。但是,呈现的结果还显示了商店没有该特定商品的组合。例如,如果用户在 Climo 中输入商品,在 ABC 中输入商店,results.html 页面将显示带有药物 CLIMO 库存的 ABC 诊所 - 即使 ABC 诊所没有该药物。

因此,Django 是否可以通过某种方式显示只有所选商品的库存的商店?要过滤 item_name 和 shop_name,需要将 stock 表连接到 shop 表(使用 shop_id),并将 stock 表连接到 item 表(使用 item_id)

另外,有没有办法使用 javascript 来做到这一点?非常感谢任何形式的帮助或指导。

from django.template import loader
from django.shortcuts import render, redirect
from django.db import connection
from django.db import IntegrityError
from django.http import JsonResponse
from .models import Shop, Stock, Item # import models
from django.http import HttpResponse


def getresult(request):
#Renders the results page allowing users to select the shop and item    
    if request.method == 'GET':
    # values sent via GET by the user
        shop_name = request.GET.get('regex_shop','')
        item_name = request.GET.get('regex_item','')
 
        shop_results = Shop.objects.filter(s_name__contains = shop_name).values()
        item_results = Item.objects.filter(i_name__contains = item_name).values()
        
        result = 's_records': shop_results, 'i_records': item_results
        return render(request,'AppInventory/results.html',result)

如果有帮助,models.py 在下面

from django.db import models

i__con
class Item(models.Model):
    i_id = models.IntegerField(primary_key=True)
    i_name = models.CharField(max_length=50)
    i_price = models.DecimalField(max_digits=5, decimal_places=2)

    class Meta:
        managed = False
        db_table = 'item'


class Stock(models.Model):
    s = models.OneToOneField('Shop', models.DO_NOTHING, primary_key=True)
    i = models.ForeignKey(Item, models.DO_NOTHING)
    s_qty = models.SmallIntegerField()

    class Meta:
        managed = False
        db_table = 'stock'
        unique_together = (('s', 'i'),)


class Shop(models.Model):
    s_id = models.IntegerField(primary_key=True)
    s_name = models.CharField(max_length=50)
    s_country = models.CharField(max_length=50)

    class Meta:
        managed = False
        db_table = 'shop'

【问题讨论】:

【参考方案1】:

您可以查询 item_results 以获取 item_id

for each_result in item_results:
    id = each_result['id']

接下来使用“id”查看库存表,得到“shop_id”,最后就可以通过“shop_id”找到店铺了:

Shop.objects.get(shop_id=shop_id)

如果模型中存在某种关系,可能会有更简单的解决方案,但我需要 models.py 代码。

【讨论】:

models.py 已添加。这有帮助吗? 是的,您需要设置一个related_name 属性:related_name="orders" 是的,您需要设置一个 related_name 属性:i = models.ForeignKey(Item, models.DO_NOTHING, related_name="stock_items") 设置后,您可以访问和查询 Stock 表:item_name = request.GET.get('regex_item','') item_name.stock_items.filter(s_qty__gte=0) 通过“stock_items”反向关系,您正在访问属于 Item 对象的所有 Stock 对象,然后过滤“s_qty " gte 字段(大于或等于)。请注意,它们之间有双下划线,因为它们应该是这样声明的。

以上是关于使用 Django 根据用户选择的另一个对象属性的值来过滤属性的对象值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Django admin 中的另一个选择标签选项更改选择标签选项?

根据同一模型中的另一个外键动态限制 Django 模型中外键的​​选择

根据用户输入从 django 模型中选择对象

Django 模板:有没有办法根据其属性查询特定对象(而不是遍历所有对象)?

Django 根据先前的查询选择数据库对象

Django - 动态模型参数值