用于ForeignKey元素的Django Queryset过滤器

西蒙

我在一个视图中构建自定义查询集时遇到问题。

这是我模型简化版本。我的想法是要跟踪不同商店中不同产品的价格。一个商店可以有多个产品,并且一个产品可以存在于多个商店中产品可以设置is_special标记以突出显示它们。选择以下结构是因为它很容易在以后添加新产品和新商店:

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)

这些是我的序列化器

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的对应视图

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实际上未在此处显示,但假定名称方案为“ Special Product XY”的产品is_special设置为True

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

1:一个查询集,其中特殊产品隐藏在输出中(也不应包括在shopProductPriceData中没有元素的商店)

[
    {
        "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:包含特殊产品的查询集:

[
    {
        "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 = Shop.objects.filter(shopproductpricedata__product__is_special=False).prefetch_related(
     Prefetch('shopProductPrice_set', queryset=ShopProductPrice.objects.filter(product__is_special=False)))
阿卜杜勒·阿齐兹·巴尔卡特|

尝试使用,prefetch_related以便相关字段已被获取,Prefetch您还可以使用过滤相关对象。

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)))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

Django queryset注释过滤器(最大)

来自分类Dev

django queryset过滤器datetimefield

来自分类Dev

Django queryset注释过滤器(最大)

来自分类Dev

Django过滤器get_queryset中的ForeignKey关系

来自分类Dev

Django过滤器queryset __in仅用于列表中的项目

来自分类Dev

基于子元素的Django queryset日期过滤器

来自分类Dev

Django:列表中每个查询的Django过滤器queryset

来自分类Dev

两种模型的Django queryset过滤器

来自分类Dev

Django CreateView ModelForm下拉字段queryset过滤器

来自分类Dev

Django queryset过滤器文件字段不为空

来自分类Dev

Django:QuerySet过滤器无法按预期工作

来自分类Dev

pk上的Django get_queryset过滤器对象

来自分类Dev

在Django中的QuerySet过滤器中反向外键

来自分类Dev

Django Queryset过滤器等效于SQL

来自分类Dev

仅当变量不为null时,Django过滤器queryset

来自分类Dev

Django,queryset过滤器datetime。在今天之后显示条目

来自分类Dev

使用属性值AND exist()应用Django queryset过滤器

来自分类Dev

脚本中的Django QuerySet堆栈过滤器

来自分类Dev

Django QuerySet 过滤器 ValueError 没有被捕获?

来自分类Dev

Django ORM Queryset 类的行为与相同的过滤器不同

来自分类Dev

Django QuerySet过滤器通过id和其他列获取queryset

来自分类Dev

使用queryset将过滤器应用于嵌套反向外键关系

来自分类Dev

是Django,queryset的过滤器和关系管理器是否相同?

来自分类Dev

在不创建实例的情况下更新过滤器queryset django中的特定字段

来自分类Dev

Django 1.9:为QuerySet创建复杂的自定义过滤器方法

来自分类Dev

在不创建实例的情况下更新过滤器queryset django中的特定字段

来自分类Dev

具有field_set的Django模型过滤器,保留为queryset

来自分类Dev

Django-缓存与QuerySet过滤器的服务器效率?

来自分类Dev

django 1.8 changelist视图和基于登录用户的queryset过滤器

Related 相关文章

  1. 1

    Django queryset注释过滤器(最大)

  2. 2

    django queryset过滤器datetimefield

  3. 3

    Django queryset注释过滤器(最大)

  4. 4

    Django过滤器get_queryset中的ForeignKey关系

  5. 5

    Django过滤器queryset __in仅用于列表中的项目

  6. 6

    基于子元素的Django queryset日期过滤器

  7. 7

    Django:列表中每个查询的Django过滤器queryset

  8. 8

    两种模型的Django queryset过滤器

  9. 9

    Django CreateView ModelForm下拉字段queryset过滤器

  10. 10

    Django queryset过滤器文件字段不为空

  11. 11

    Django:QuerySet过滤器无法按预期工作

  12. 12

    pk上的Django get_queryset过滤器对象

  13. 13

    在Django中的QuerySet过滤器中反向外键

  14. 14

    Django Queryset过滤器等效于SQL

  15. 15

    仅当变量不为null时,Django过滤器queryset

  16. 16

    Django,queryset过滤器datetime。在今天之后显示条目

  17. 17

    使用属性值AND exist()应用Django queryset过滤器

  18. 18

    脚本中的Django QuerySet堆栈过滤器

  19. 19

    Django QuerySet 过滤器 ValueError 没有被捕获?

  20. 20

    Django ORM Queryset 类的行为与相同的过滤器不同

  21. 21

    Django QuerySet过滤器通过id和其他列获取queryset

  22. 22

    使用queryset将过滤器应用于嵌套反向外键关系

  23. 23

    是Django,queryset的过滤器和关系管理器是否相同?

  24. 24

    在不创建实例的情况下更新过滤器queryset django中的特定字段

  25. 25

    Django 1.9:为QuerySet创建复杂的自定义过滤器方法

  26. 26

    在不创建实例的情况下更新过滤器queryset django中的特定字段

  27. 27

    具有field_set的Django模型过滤器,保留为queryset

  28. 28

    Django-缓存与QuerySet过滤器的服务器效率?

  29. 29

    django 1.8 changelist视图和基于登录用户的queryset过滤器

热门标签

归档