标签: annotate

Django:如何基于另一个注释进行注释,或者对注释执行操作

所以我正在做一些组织学校日程安排的事情.有问题的学校的组织方式是课程在同一个房间里,老师一起移动,时间表每天都不同,并不是所有的老师或班级同时在建筑物内,有些老师们教他们的时候非常挑剔.

我有这些模型:

class Teacher(models.Model):
    christian_name = models.CharField(max_length=200)
    family_name = models.CharField(max_length=200)
    ...

class TeacherAvailableHour(models.Model):
    teacher = models.ForeignKey('Teacher')

class Requirement(models.Model):
    ...
    teacher = models.ForeignKey('Teacher')
    per_week = models.PositiveIntegerField()
    ...
Run Code Online (Sandbox Code Playgroud)

所以我要做的就是先为最挑剔的老师制定一个时间表,即他们可以教的时间比例最小的教师(总"教师可用的时间")和他们需要教授的小时数(总和)所有老师的"Requirement.per_week").

换句话说,我需要"order_by"这个比例.我想不出怎么做.试过这个:

Teachers=Teacher.objects.annotate(availability=(Count('teacheravailablehour') / Sum('requirement__per_week')).order_by('availability')
Run Code Online (Sandbox Code Playgroud)

当然,这会因错误而爆炸.我也试过像双重注释的东西:

Teachers=Teacher.objects.annotate(availability=Count('teacheravailablehour')).annotate(required=Sum('requirement__per_week')).annotate(availRatio=(('availability') / ('required')).order_by('-availRatio')
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?这甚至可能吗?

django aggregate annotate

5
推荐指数
1
解决办法
1508
查看次数

通过matplotlib中的箭头连接轴中的点和另一个轴中的另一个点

使用matplotlib,我正在制作一个包含两个Axes对象的图形(即两组xy轴).我想连接两个点 - 一个从一个轴中拾取,另一个从另一个轴中拾取---通过箭头或线.

我试图通过使用annotate()函数和ConnectionPatch对象来做到这一点,但在两种方式中,箭头的一部分被轴的"框架"隐藏.请参阅附图,其中我尝试通过ConnectionPatch对象连接两个轴的原点.

我还附加了用于生成图形的脚本.

有没有办法"提前"箭头(或将轴框架推到后面)?

试图连接两个轴的原点.

#!/usr/bin/python
# 
# This script was written by Norio TAKEMOTO 2012-5-7


import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch

# creating a figure and axes.
fig=plt.figure(figsize=(10,5))

ax1=plt.axes([0.05,0.15,0.40,0.80])

plt.xticks([0])
plt.yticks([0])
plt.xlim((-1.23, 1.23))
plt.ylim((-2.34, 2.34))


ax2=plt.axes([0.60,0.15, 0.30, 0.30])

plt.xticks([0])
plt.yticks([0])
plt.xlim((-3.45, 3.45))
plt.ylim((-4.56, 4.56))


# trying to connect the point (0,0) in ax1 and the point (0,0) in ax2
# by an arrow, but some part is hidden. I can't find a solution. Let's
# ask …
Run Code Online (Sandbox Code Playgroud)

python plot annotate matplotlib

5
推荐指数
1
解决办法
805
查看次数

与Java中的@Override相反的标记

我知道在Java中是@Override标注注释方法,它覆盖来自超类的方法,如果不存在警告.我的问题:是否有一个与annotate方法相反的标签,我们不想覆盖超类的方法(例如偶然)?

我知道我可以在超类中设置方法final,但是这个解决方案涉及超类代码的更改.这就是我不想做的 - 只想改变我的代码:)

我知道我可以为这个方法设置另一个名字,但有时候在超级类中有很多方法而你根本就没有意识到它们.因此,当您在子类中实现自己的时,可能会偶然使用相同的名称.怎么避免这个?

java methods overriding annotate superclass

5
推荐指数
1
解决办法
605
查看次数

将文本锚定或锁定到 Matplotlib 中的标记

有什么方法可以将文本锚定或锁定到标记吗?当使用 提供的交互式缩放时pyplot,文本会超出范围,如图所示。

import matplotlib.pyplot as plt

x=[2,4]
y=[2,3]

fig, ax = plt.subplots()
ax.plot(x, y, 'ro',markersize=23)

offset = 1.0 
ax.set_xlim(min(x)-offset, max(x)+ offset)
ax.set_ylim(min(y)-offset, max(y)+ offset)

for x,y in zip(x,y):
     ax.annotate(str(y),  xy=(x-0.028,y-0.028))

plt.show()
Run Code Online (Sandbox Code Playgroud)

文字超出范围

python text annotate matplotlib marker

5
推荐指数
1
解决办法
2611
查看次数

在 Django 聚合中使用 ifnull 默认值

我有以下模型类:

class Goods(models.Model):
    name = models.CharField(max_length=100)

class InRecord(models.Model):
    goods = models.ForeignKey(Goods, related_name='in_records')
    timestamp = models.DateTimeField()
    quantity = models.IntegerField()

class OutRecord(models.Model):
    goods = models.ForeignKey(Goods, related_name='out_records')
    timestamp = models.DateTimeField()
    quantity = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

因此,我想获得一个 QuerySet,其中包含所有具有正存储库的商品。

另一种描述它的方式是,我想过滤具有比 OutRecord 摘要更大的 InRecord 数量摘要的 Goods。


我试过的:

首先,我使用annotate将摘要添加到查询集中:

qs = Goods.objects.annotate(
        qty_in=Sum(in_records__quantity), 
        qty_out=Sum(out_records_quantity)
    )
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但有一个问题,当某些商品没有相关的 in_records 或 out_records 时,注释的字段返回 None

问题:那么,在这种情况下,我有什么方法可以设置默认值,就像ifnull(max(inreocrd.quantity), 0)sql 中的* 调用一样?


在此之后,我想在该 QuerySet 上添加一个过滤器:

我试过:

qs = qs.filter(qty_in__gt(F(qty_out)))
Run Code Online (Sandbox Code Playgroud)

但是如果没有货物的记录,它仍然不起作用。

请帮忙。

django default aggregate annotate models

5
推荐指数
1
解决办法
2413
查看次数

在 Django 中注释 value() 查询

我的RelatedModel有一个指向Product对象的外键字段。我正在尝试计算RelatedModel每个ProductUUID 的数量。

RelatedModel.objects.all().values(fk_product__uuid).annotate(total=Count('id'))
Run Code Online (Sandbox Code Playgroud)

这给了我:

[
{'total': 3, 'fk_product__uuid': UUID('195b6aa8-6a57-62c6-89d1-3397bf69d928')},
{'total': 7, 'fk_product__uuid': UUID('2a6a6a98-1a17-4cca-8111-2212b951003a')},
...
]
Run Code Online (Sandbox Code Playgroud)

我更喜欢将我的 UUID 密钥称为“uuid”,但我很难处理annotate相反的关系。有没有办法在不对列表进行后处理的情况下做到这一点?

django annotate

5
推荐指数
1
解决办法
1万
查看次数

django - 在后续注释中使用注释的结果

我有以下模型结构:

Model A:
    [no question-relevant fields]

Model B:
    linked_to = ForeignKey(A, related_name='involved')
    date = DateField()
    amount = IntegerField()
Run Code Online (Sandbox Code Playgroud)

我想要做的是为每个对象 A 获取所有相关的模型 B,从这个子集中按日期获取最新的模型,然后计算具有相同日期和相同连接的 A 对象的所有模型 B 的总和。

现在我正在使用这个查询:

A.objects.all().annotate(latest_date=Max('involved__date'))
Run Code Online (Sandbox Code Playgroud)

这将为每个 A 对象返回正确的最新日期,接下来我正在尝试:

A.objects.all().annotate(latest_date=Max('involved__date')).annotate(total=Sum(Case(When(involved__date=F('latest_date'), then='involved__amount'))))
Run Code Online (Sandbox Code Playgroud)

但我得到了一个

AttributeError: 'Case' object has no attribute 'name'.

我以前使用过多个注释,没有任何问题,不同之处在于,过去我总是使用来自现有字段的先前注释值,而不是最大值/最小值,所以我不确定这是否有所不同。

Django 版本是 1.8

我不能在这里使用任何原始 SQL,我知道这可以通过 2 个步骤轻松完成,但在这一点上,更多的是个人对了解其工作原理的好奇心。

python django annotate

5
推荐指数
0
解决办法
684
查看次数

Django QuerySet批注。如何从F表达式中识别用户时区的日期时间?

我创建了一个Django 1.11。应用。我有一个模型来存储用户的时间段

WeeklySchedule(models.Model):

    """Model representing a weekly schedule of user"""

    user_profile = models.ForeignKey(UserProfile)

    DAY_OF_WEEK =(
    (1,'Monday'),
    (2, 'Tuesday'),
    (3, 'Wednesday'),
    (4, 'Thursday'),
    (5, 'Friday'),
    (6, 'Saturday'),
    (7, 'Sunday'),
    )
    day_of_week = models.IntegerField(choices=DAY_OF_WEEK)

    time_from = models.TimeField()
    time_to = models.TimeField()
Run Code Online (Sandbox Code Playgroud)

我有一个用于用户个人资料的模型

class UserProfile(models.Model):

    # This line is required. Links UserProfile to a User model instance.
    user = models.OneToOneField(User, related_name='profile')

    # The additional attributes we wish to include.

    timezone = models.CharField(
        max_length=255,
        choices=[(t,t) for t in pytz.common_timezones],
        blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

首先,我尝试根据用户的时区了解日期时间,并稍后在utc中转换所有日期时间,但是使用带有F表达式的make_aware方法时出现错误:

from django.utils import …
Run Code Online (Sandbox Code Playgroud)

python django orm timezone annotate

5
推荐指数
0
解决办法
369
查看次数

django 在 manytomany 字段上使用 order_by() 在分页中重复

我正在对来自 manytomany 对象的时间字段进行排序,但在分页过程中遇到问题。

模型.py:

class Validated(models.Model):
    job_id_list = models.ManyToManyField(JobId , related_name='JobId', blank=True)  

class JobId(models.Model):
    user = models.ForeignKey(User, blank=True, null=True, default=None)
    job_time = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

视图.py:

results_list = Validated.objects.filter(job_id_list__user=request.user).\
               distinct().order_by('-job_id_list__job_time')
Run Code Online (Sandbox Code Playgroud)

我的问题是分页搞砸了,即使查询输出正常,我的分页输出中也会出现重复项。(其他这个问题

我尝试了几种解决方案,但我的问题没有得到解决,因为排序是基于多对多对象的字段 order_by('job_id_list__job_time')

我正在考虑通过annotation使用Model.Manager. 在此注释中,我尝试添加job_time模型内部函数的结果。这样, job_time 将很容易访问:

for i in result_list:
    job_time_from_model = result_list[i].job_time
Run Code Online (Sandbox Code Playgroud)

我会按如下方式执行此操作,但我不知道如何将%%function logic%%内部注释合并。

这甚至可能以这种方式还是需要另一种方法?

模型.py:

class ValidatedManager(models.Manager):      
    **%%function-logic%%**
    def date(self, user, id):
            xlinkdatabase_validated_object = self.get(id=id)
            job_id_list = xlinkdatabase_validated_object.\
                    job_id_list.all().order_by('-job_time')
            date_added = None
            for item …
Run Code Online (Sandbox Code Playgroud)

python django pagination annotate sql-order-by

5
推荐指数
0
解决办法
537
查看次数

如何使用 ExpressionWrapper 使用今天和 DateField 之间的差异来注释查询集

我正在尝试根据 DateField 对查询集进行注释,如图所示。

我使用的是 Django 版本 1.8.12 和 MYSQL 版本 5.6.40。

尝试遵循如何用自创建以来的天数注释查询集,但这里它是一个 DateTimeField。下面的评论说“将其更改为 Value(now.date(), DateField()) - F('creation_date__date'),不起作用”

型号代码如下所示:

class Holding(models.Model):
    trans_date = models.DateField(_("Trans. Date"), null=False)
    ...
Run Code Online (Sandbox Code Playgroud)

给出错误持续时间的注释查询如下所示:

today = timezone.now().date()
testqs = Holding.objects.filter(id=1)
myqs = testqs.annotate(duration = ExpressionWrapper( Value(today, DateField()) - F('trans_date'), output_field=DurationField()))
Run Code Online (Sandbox Code Playgroud)

当我尝试打印时,我得到的只是“无”。打印差异以供参考。

for i in myqs:
    print i.duration, '-', today-i.trans_date

None - 1224 days, 0:00:00
None - 1206 days, 0:00:00
None - 1144 days, 0:00:00
None - 1051 days, 0:00:00
None - 1045 days, 0:00:00
Run Code Online (Sandbox Code Playgroud)

我希望持续时间是一个 …

django annotate django-queryset datefield

5
推荐指数
1
解决办法
1504
查看次数