- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个像这样的模型(简化):
class TrainingMoment(models.Model):
date = models.DateField()
# Moment of the day, 2 is afternoon for example
moment_nr = models.IntegerField()
is_group_moment = models.BooleanField()
在给定日期和 moment_nr 上,可以存在 2 行。一种是 is_group_moment=False
,另一种是 is_group_moment=True
。对于 TrainingMoment.objects.filter(date__range=(start_date,end_date))
中的每一个重复项,我想排除 is_group_moment = True
的行。
请注意,如果存在具有相同日期和 moment_nr 且 is_group_moment=False
的行,我只想排除带有 is_group_moment=True
的行。
我尝试使用 annotate() 和 group_by() 来获取重复的行,但这只给了 med 每个重复行集中的一个,而不是我想要的两者。
例如:
╔════════════════════════════════════════╗
║ date moment_nr is_group_moment ║
╠════════════════════════════════════════╣
║ 2013-10-01 1 True ║
║ 2013-10-02 1 True ║
║ 2013-10-02 1 False ║
║ 2013-10-03 1 False ║
║ 2013-10-03 2 False ║
║ 2013-10-04 2 True ║
║ 2013-10-04 2 False ║
║ 2013-10-01 1 True ║
╚════════════════════════════════════════╝
应该是:
╔═════════════════════════════════════════╗
║ date moment_nr is_group_moment ║
╠═════════════════════════════════════════╣
║ 2013-10-01 1 True ║
║ 2013-10-02 1 False ║
║ 2013-10-03 1 False ║
║ 2013-10-03 2 False ║
║ 2013-10-04 2 False ║
║ 2013-10-01 1 True ║
╚═════════════════════════════════════════╝
我有另一个模型,Activity,它存储训练时间,我想在其中使用上面的查询集来获得正确的一周总和:
class Activity(models.Model):
activitytype = models.ForeignKey(ActivityType)
trainingmoment = models.ForeignKey(TrainingMoment)
# Time in minutes
time = models.IntegerField()
我想要完成的任务摘要:
# 1. Get training moments for a given period, for example a week (no problem here)
tms_for_summing = TrainingMoment.objects.filter(date__range=(start_date,end_date))
# 2. Filter out duplicates in the way described above
# 3. Use the resulting queryset (tms_for_summing) to sum activity
summed_activity = Activity.objects.filter(trainingmoment__in = tms_for_summing)
编辑对于那些想知道我的数据库设计的人来说,以下是一些额外的解释:
正如您可能已经想到的那样,这是一个训练日志应用程序。在我的问题中,我想要实现的页面是规划页面。所有训练时刻都是有计划的训练时刻。个别运动员可以计划自己的训练。此外,教练可以同时为一组运动员计划训练。这成为一个组时刻(is_groupmoment = True 的训练时刻,也是链接到特定组的多对多字段)。如果运动员计划在他也有集体时刻的第 nr 和日期的集体时刻,则他自己的时刻应优先于该时刻。
一个实用的、非常简单的例子
我有以下个人时刻:一天,一刻星期一 1星期二 1
以及以下小组时刻:一天,一刻星期二 1星期三 1
在显示时刻和与这些时刻相关的总事件的表格中,我想显示周一和周二的个人时刻,以及周三的团体时刻,因为那里没有个人时刻覆盖团体时刻。我可以使用纯 python 代码在 View 中进行求和,通过对时刻进行逐一求和,同时检查同一日期的时刻是否同时存在组时刻和单独时刻,但这将是一种非常丑陋且缓慢的方法它,特别是在总结全年时。
我尝试过的
我已经尝试过这个:
training_moments = TrainingMoment.objects.filter(date__range=('2013-08-19','2013-10-28'))
moments_to_exclude = training_moments.annotate(num_dates=Count('date'), num_momentnrs=Count('momentnr')).filter(num_dates__gt= 1, num_momentnrs__gt=1)
这已经很接近了。这样我就可以为每个“时间段”获得一个时刻(其中团体时刻和个人时刻的时刻编号和日期相同)。问题是我需要获得两个“碰撞”时刻。然后,我可以从结果查询集中排除组时刻,并最终在对我的应用程序中的训练时刻进行求和时排除时刻。
moments_to_exclude = moments_to_exclude.exclude(is_group_moment=True)
desired_result = training_moments.exclude(pk__in=moments_to_exclude)
最佳答案
像这样
TrainingMoment.objects.filter(date=… , moment_nr=…).exclude(is_group_moment=True)
我建议您阅读 django 文档中有关模型 API 的一些内容,并使用 manage.py shell
编辑
所以这可能不是完美的解决方案,但它肯定是您想要的方向。您需要的是将其分为两个类别:Moment 和 Trainee。受训者暂时将拥有一个 bool 字段和一个外键。
class Moment(models.Model):
date = …
number = …
class Trainee(models.Model):
is_group = models.BooleanField()
moment = models.ForeignKey(Moment)
您在这里获得的是,没有具有相同日期+数字字段的重复 Moment 对象,因此更容易过滤范围,而不会太麻烦。同时,对真实值进行过滤更容易(使用方法进行),并且您可以根据客户规模进行过滤(甚至只需检查相关受训者的数量)。
您必须添加自定义约束以防止添加具有相同信息的对象,但这并不是很复杂
编辑2
为了回答您的评论,让我们以您的示例表为例。假设您当前的布局如下所示:
╔════════════════════════════════════════╗
║ date moment_nr is_group_moment ║
╠════════════════════════════════════════╣
║ 2013-10-01 1 True ║
║ 2013-10-02 1 True ║
║ 2013-10-02 1 False ║
║ 2013-10-03 1 False ║
║ 2013-10-03 2 False ║
║ 2013-10-04 2 True ║
║ 2013-10-04 2 False ║
╚════════════════════════════════════════╝
然后根据我的设计建议,它看起来像这样:
╔════════════════════════════════════════╗
║ date moment_nr related trainees ║
╠════════════════════════════════════════╣
║ 2013-10-01 1 True ║
║ 2013-10-02 1 True, False ║
║ 2013-10-03 1 False ║
║ 2013-10-03 2 False ║
║ 2013-10-04 2 True, False ║
╚════════════════════════════════════════╝
因为现在您没有重复的行,即它实际上会将早期设计中的两个 Moment 对象合并为一个具有两个相关 Trainee 对象的对象。
换句话说,问题末尾的最终代码将如下所示:
# 1. Get training moments for a given period, for example a week (no problem here)
tms_for_summing = TrainingMoment.objects.filter(date__range=(start_date,end_date))
# 3. Use the resulting queryset (tms_for_summing) to sum activity
summed_activity = Activity.objects.filter(trainingmoment__in = tms_for_summing)
坦率地说,也可以缩减为一行:
summed = Activity.objects.filter(trainingmoment__range=(start_date, end_date))
关于django - 排除 Django 中的一行重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19492179/
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!