使用 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 模型中外键的选择