【问题标题】:How to filter queryset not equal to in Django?如何在 Django 中过滤不等于的查询集?
【发布时间】:2016-02-19 00:12:09
【问题描述】:

我有一些名为 Stores 和 SaleItems 的模型,它们看起来有点像这样。

class Stores(models.Model):
    name = models.CharField(unique=True, max_length=20)


class SaleItems(models.Model):
    sale_by = models.ForeignKey(Stores)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

所以我需要根据以下条件检索销售商品。

  1. 如果不是我的商店,则忽略 start_date 大于今天和 end_date 小于今天的项目。
  2. 如果是我的商店,则获取商品,无论 start_date 和 end_date 是什么。

所以在我的views.py中,这就是我的进步。

class SaleItemsView(viewsets.ModelViewSet):
    querys = SaleItems.objects.all()


def get_queryset(self):
    #get my store id
    store_id = self.request.query_params.get('store_id')
    querys = SaleItems.objects\
            .exclude(store__ne=store_id, end_date__lt=timezone.now())\
            .exclude(store__ne=store_id, start_date__gt=timezone.now())
    return querys

但似乎 django 不再有不等于运算符了。还有其他方法可以实现吗?

【问题讨论】:

  • 1) 您遇到的错误是什么? 2)这可能与错字“.exculde”有关吗?
  • @RemcoGerlich 这只是一个错字。这是我使用 __ne 'TypeError: Related Field got invalid lookup: ne' 时遇到的错误
  • this 是同一个问题,不是吗?
  • @DevilPinky 不是。请阅读问题描述。

标签: python django django-rest-framework


【解决方案1】:

我认为您可以使用 Qobjects 组合每个条件的记录,然后使用 distinct() 删除重复项:

now = timezone.now()
items_within_date_range = Q(start_date__lte=today, end_date__gte=today)
curr_store_items = Q(store=store_id)

result = SaleItems.objects.filter(items_within_date_range|curr_store_items).distinct()

第一个查询将获取您商店和其他商店的时间范围内的所有商品,第二个查询将获取您商店的所有商品,然后组合然后将获取所有商品。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2012-04-19
    • 2016-02-01
    • 1970-01-01
    • 2019-12-04
    • 2011-02-06
    • 2020-08-22
    • 2019-04-15
    相关资源
    最近更新 更多