首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ForeignKey元素的Django Queryset滤波器

ForeignKey元素的Django Queryset滤波器
EN

Stack Overflow用户
提问于 2021-02-09 05:09:42
回答 1查看 35关注 0票数 0

在我的视图中构建自定义查询集时,我遇到了问题。

下面是我的模型的简化版本。我的想法是,我想跟踪不同商店的不同产品的价格。商店可以有多个产品产品可以出现在多个商店中。产品可以设置一个is_special标志来突出显示它们。之所以选择以下结构,是因为它很容易允许以后添加新产品和商店:

代码语言:javascript
运行
AI代码解释
复制
class Product(models.Model):
    product_id = models.CharField(max_length=255, primary_key=True)
    is_special = models.BooleanField(default=False)
    product_name = models.CharField(max_length=255, default='', blank=False, null=False)

class ShopProductPrice(models.Model):
    product = models.ForeignKey("Product", on_delete=models.CASCADE)
    shop = models.ForeignKey("Shop", on_delete=models.CASCADE, related_name="shop_entry")
    price = models.FloatField(default=0.0, null=False)

class Shop(models.Model):
    name = models.CharField(max_length=255, default='', blank=False, null=False)
    location = models.CharField(max_length=255, default='', blank=False, null=False)

这些是我的序列化程序

代码语言:javascript
运行
AI代码解释
复制
class ShopProductPriceSerializer(serializers.ModelSerializer):
    class Meta:
        model = ShopProductPrice
        fields = ['product', 'price']

class ShopSerializer(serializers.ModelSerializer):
    shopProductPriceData = ShopProductPriceSerializer(many=True, source='shopProductPrice_set')

    class Meta:
        model = Shop
        fields = ['name', 'location', 'shopProductPriceData']

最后,下面是对应的视图,其中我想使用自定义queryset

代码语言:javascript
运行
AI代码解释
复制
class ShopViewSet(viewsets.ModelViewSet):
    queryset = Shop.objects.all()
    serializer_class = ShopSerializer

    def get_queryset(self):
        queryset = Shop.objects.filter(shopproductpricedata__product__is_special=False)
        return queryset

重点点现在是get_queryset()函数。这就是我实际上在做的,我不知道如何继续下去。我试图实现的是使用控件属性is_special属性,如果特殊产品应该是输出的一部分,则为.

下面是我想要输出的两个示例(属性is_special实际上不在这里显示,但假设名称为的产品名称为“特殊产品XY"is_special设置为True)

我在找两个不同的查询集:

1: --一个特殊产品隐藏在输出中的问题集( shopProductPriceData中没有元素的商店也不应该包括在内)

代码语言:javascript
运行
AI代码解释
复制
[
    {
        "name": "Shop A",
        "location": "New York",
        "shopProductPriceData": [
            {
                "product_name": "Product 2",
                "price": 100.0
            }
        ]
    },
    {
        "location": "Shop B",
        "date": "Berlin",
        "shopProductPriceData": [
            {
                "product_name": "Product 3",
                "price": 100.0
            }
        ]
    }
]

2: --包含特殊产品的查询集:

代码语言:javascript
运行
AI代码解释
复制
[
    {
        "name": "Shop A",
        "location": "New York",
        "shopProductPriceData": [
            {
                "product_name": "Special Product 1",
                "price": 5.0
            },
            {
                "product_name": "Product 2",
                "price": 100.0
            }
        ]
    },
    {
        "location": "Shop B",
        "date": "Berlin",
        "shopProductPriceData": [
            {
                "product_name": "Special Product 1",
                "price": 8.0
            },
            {
                "product_name": "Product 3",
                "price": 100.0
            },
            {
                "product_name": "Special Product 2",
                "price": 100.0
            }
        ]
    }
]

但是,对于我前面给出的查询集,这是行不通的:

queryset = Shop.objects.filter(shopproductpricedata__product__is_special=True)实际上返回所有至少有一个is_special=True产品的商店

queryset = Shop.objects.filter(shopproductpricedata__product__is_special=True)返回所有至少有一个is_special=False产品的商店。

在这两种情况下,如果显示了商店,那么所有嵌套产品都会显示出来,不管它们是否是特殊产品。

您能帮我想出一个自定义的queryset生成器来产生我想要的输出吗?

编辑:这是工作解决方案:

代码语言:javascript
运行
AI代码解释
复制
queryset = Shop.objects.filter(shopproductpricedata__product__is_special=False).prefetch_related(
     Prefetch('shopProductPrice_set', queryset=ShopProductPrice.objects.filter(product__is_special=False)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-09 05:51:23

尝试使用prefetch_related,以便已经获取相关字段,也可以使用Prefetch对相关对象进行筛选。

代码语言:javascript
运行
AI代码解释
复制
from django.db.models import Prefetch

queryset = Shop.objects.filter(shopproductpricedata__product__is_special=False).prefetch_related(
    Prefetch('shopproductpricedata__product', queryset=Product.objects.filter(is_special=False)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66119658

复制
相关文章
jQuery - AJAX load() 方法
下面的例子会把文件 "demo_test.txt" 的内容加载到指定的 <div> 元素中:
陈不成i
2021/07/22
1.5K0
jquery中load的用法
调用load方法的完整格式是:load( url, [data], [callback] ),其中
OECOM
2020/07/01
1.1K0
延迟加载图片的jQuery插件-Lazy Load Plugin for JQuery
Lazy Load是一个用Javascript写得jQuery插件。它可以使一个长网页中,不在当前视图中的图片延迟加载,以提高页面的载入速度。
EltonZheng
2021/01/26
3.8K0
jQuery - AJAX 简介及AJAX load() 方法
简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示。
用户7718188
2021/10/07
1K0
pickle.load()函数
此函数和 dump() 函数相对应,用于将二进制对象文件转换成 Python 对象。该函数的基本语法格式为:
用户8442333
2021/11/30
9.3K0
Teamviewer显示“未就绪,请检查您的连接”解决办法
  打开TeamViewer一直提示“未就绪,请检查您的连接”,一直会弹出一个框提示检查网路设置什么。
_一级菜鸟
2019/09/10
13.6K0
Teamviewer显示“未就绪,请检查您的连接”解决办法
延迟加载图片的 jQuery 插件:Lazy Load
网站的速度非常重要,现在有很多网站优化的工具,如 Google 的 Page Speed,Yahoo 的 YSlow,对于网页图片,Yahoo 还提供 Smush.it 这个工具对图片进行批量压缩,但是对于图片非常多的网站,载入网页还是需要比较长的时间,这个时候我们可以使用 Lazy Load 这个 jQuery 插件来延迟加载图片。
Denis
2023/04/15
1.9K0
jquery中load中文乱码的解决方法
本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可
IT小马哥
2022/11/16
5290
jQuery遍历函数
.closest():从元素本身開始,逐级向上级元素匹配。并返回最先匹配的祖先元素。
全栈程序员站长
2022/07/07
1.1K0
【冷知识】jQuery 中load()方法页面显示空白bug
项目中,使用jquery中的load方法加载页面,一直不能实现。页面显示空白,也不提示错误。 代码如下:
用户9914333
2022/07/22
1.1K0
jQuery AJAX load()方法中代码执行顺序的问题
问题来源于菜鸟教程介绍 jQuery load() 方法时用的一个实例: JS:
Chor
2019/11/08
1.5K0
kubernetes就绪探针
Kubernetes中的就绪探针(readiness probe)是一种用于检查应用程序是否已准备好接收流量的机制。就绪探针可以帮助Kubernetes确保应用程序只有在准备好接收流量时才会被暴露给外部服务。
玖叁叁
2023/04/29
1.8K0
jquery定时执行函数_jquery自动提交
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/01
2.3K0
JQuery高级应用
toggle([speed],[easing],[fn]) :切换,显示则隐藏,隐藏则显示
乐心湖
2021/01/18
5.9K0
JQuery高级应用
layui布局 使用jquery的load后页面js失效
布局页面 H5在主体部分用jquery的load方法引入其他页面本页面js失效 <!DOCTYPE html> <html> <head> <meta charset="utf-8">
用户5899361
2020/12/07
2.6K0
layui布局 使用jquery的load后页面js失效
布局页面 H5在主体部分用jquery的load方法引入其他页面本页面js失效 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <title>layout 后台大布局 - Layui</title> <link rel="stylesheet" hr
用户5899361
2020/12/02
4.3K0
layui布局 使用jquery的load后页面js失效
Matlab数据导入--importdata和load函数
在使用matlab将数据导入到工作空间的时候,经常会使用到两个函数,一个是importdata函数,另一个是load函数,它们的使用方法和使用场景是太相同的,如果不太注意就可能会犯错误,在这里做简要的说明和记录。
用户9925864
2022/07/27
1.1K0
Matlab数据导入--importdata和load函数
jQuery的animate函数
jQuery提供了一个animate函数,可以通过改变CSS属性来实现一些动画效果。
大江小浪
2018/07/25
1.7K0
jQuery函数的使用
上述代码将从Google的CDN中加载jQuery库。确保将其放在<head>标签或页面内容的顶部。
堕落飞鸟
2023/05/18
1.5K0
点击加载更多

相似问题

jquery就绪函数未执行

21

jquery就绪函数在函数内部未命中

12

在jQuery .load()内容完全就绪后执行javascript函数

12

Jquery中未给出输出的就绪函数

11

在jquery循环幻灯片中使用load函数代替就绪函数

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文