【问题标题】:Django search : query multiple table, join them then return the querysetDjango 搜索:查询多个表,加入它们然后返回查询集
【发布时间】:2020-03-18 10:45:21
【问题描述】:

我正在搜索我的产品价格跟踪应用,并且有 2 种型号的产品和扫描

class products(models.Model):
    enter code hereproduct_id = models.IntegerField(primary_key=True)
    product_name = models.CharField(max_length=100)
    product_link = models.CharField(max_length=255)
    image_link = models.CharField(max_length=100)
    store_name = models.CharField(max_length=100)

    class Meta:
        verbose_name_plural = "products"

    def __str__(self):
        return str(self.product_name)

class scans(models.Model):
    scan_id = models.IntegerField(primary_key=True)
    prod_id = models.IntegerField(models.ForeignKey("scrape.Model", on_delete=models.CASCADE))
    price = models.IntegerField()
    scanned_time = models.DateTimeField(default=timezone.now)

    class Meta:
      verbose_name_plural = "scans"

    def __repr__(self):
        return str(self.prod_id)

搜索应该采用名称(字符串)输入并在同一个表中查询商店名称,并在另一个表中查询价格并返回带有产品名称、商店名称和价格的查询集。

我试过了

class searchResults(ListView):
model = 'products', 'scans'
template_name = 'result.html'

# let query = GET request from form (in home.html)
def get_queryset(self):
    queryset = []
    rawquery = self.request.GET.get('q')
    queries = rawquery.split(" ")
    for q in queries:
        prodresults = products.objects.filter(
            Q(product_name__icontains=q)
        ).distinct()

        for prodresult in prodresults:
            prod_id = products.objects.get(product_name=prodresult).product_id
            prod_price = scans.objects.get(prod_id=prod_id).price

        for result in prodresults:
            #joins results toegther
            queryset.append(result)
            queryset.append(prod_price)

    return list(set(queryset))

代码崩溃了

prod_price = scans.objects.get(prod_id=prod_id).price

scans matching query does not exist.

【问题讨论】:

  • 你从self.request.GET.get('q')得到什么?
  • 首先请修正你的代码 sn-p 缩进。
  • 我真的不明白你在做什么:prodresult(在你的 for 循环中)是一个 products instance,而不是 name 的产品,所以products.objects.get(product_name=prodresult) 不能工作。它应该已经在这里崩溃了。另外,IntegerField(ForeignKey('scrape.Model))` 应该是什么?这与产品有什么关系?为什么不使用ForeignKey('products')
  • 你应该可以做到scans.objects.get(prod_id=prodresult) 但这是假设prod_idForeignKeyproducts,而不是奇怪的IntegerField

标签: python django django-models


【解决方案1】:

在命名、编码和 Django 约定方面,您的模型确实没有正确定义。你应该把它们改成这样:

class Product(models.Model):  # Capital P, singular
    id = models.IntegerField(primary_key=True)  # id, not product_id
    name = models.CharField(max_length=100)  # name, not product_name
    link = models.CharField(max_length=255)
    image_link = models.CharField(max_length=100)
    store_name = models.CharField(max_length=100)

    # ...

class Scan(models.Model):
    id = models.IntegerField(primary_key=True)
    product = models.ForeignKey("Product", on_delete=models.CASCADE, related_name="scans")  # FK to Product
    price = models.IntegerField()
    scanned_time = models.DateTimeField(default=timezone.now)

    # ...

那么当你有一个产品查询集时:

results = Product.objects.filter(product_name__icontains=q).distinct()

您可以遍历它们并检索相应的扫描:

for product in results:
    scans = Scan.objects.filter(product=product)  # You can have more than one Scan for the same product, since this is a one-to-many relationship!

更好的是,您可以在一个查询中完成所有这些操作:

scans = Scan.objects.filter(product__in=Product.objects.filter(
    product_name__icontains=q))

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 2019-09-01
    • 2017-12-05
    • 1970-01-01
    • 2020-11-24
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多