Django ORM使用字典数组排除记录

2024-06-28 19:44:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有类似的代码返回表中的所有条目:

all_entries = Entry.objects.all()

我有以下数组:

exclusion_list = [
  {
    "username": "Tom",
    "start_date": 01/03/2019,
    "end_date": 29/02/2020,
  },
  {
    "username": "Mark",
    "start_date": 01/02/2020,
    "end_date": 29/02/2020,
  },
  {
    "username": "Pam",
    "start_date": 01/03/2019,
    "end_date": 29/02/2020,
  }
]

我想排除从“2019年3月1日”到“2020年2月29日”的所有Tom记录,从“2020年2月1日”到“2020年2月29日”的所有“Mark”记录,以及从“2019年3月1日”到“2020年2月29日”的所有Pam记录

我想在一个循环中这样做,所以我认为我应该这样做:

for entry in all_entries:
    filtered_entry = all_entries.exclude(username=entry.username).filter(date__gte=entry.start_date, date__lte=entry.end_date)

这种方法正确吗?我是Django ORM的新手。有更好、更有效的解决方案吗

谢谢你的帮助


Tags: 代码dateobjects记录username条目allstart
1条回答
网友
1楼 · 发布于 2024-06-28 19:44:41

是的,你可以通过循环来完成

这将导致一个查询,该查询的WHERE子句在循环的每个周期都得到扩展。但要做到这一点,您必须使用上一个周期的过滤查询集:

filtered_entry = all_entries

for exclude_entry in exclusion_list:
   filtered_entry = filtered_entry.exclude(username=exclude_entry.username, date__gte=exclude_entry.start_date, date__lte=exclude_entry.end_date)
笔记
  • 使用queryset的相同引用进一步限制每个循环周期的结果
  • 要使用与AND相关的多个条件,只需在exclude()中写入多个关键字参数(查看文档[here][1])
  • 请注意,这可能会导致一个较大的WHERE子句,并且可能会限制您的数据库

所以如果你的排除列表不是太大,我想你可以不用担心

如果排除列表增加,最好将排除列表保存在数据库中。有了这个,ORM可以生成子查询而不是单个值。举个例子:

exclusion_query = ExclusionEntry.objects.all().values('username')

filtered = all_entries.exclude(username__in=exclusion_query)
  [1]: https://docs.djangoproject.com/en/3.1/topics/db/queries/#retrieving-specific-objects-with-filters

相关问题 更多 >