所以我正在做一些组织学校日程安排的事情.有问题的学校的组织方式是课程在同一个房间里,老师一起移动,时间表每天都不同,并不是所有的老师或班级同时在建筑物内,有些老师们教他们的时候非常挑剔.
我有这些模型:
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)
做这个的最好方式是什么?这甚至可能吗?
使用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) 我知道在Java中是@Override标注注释方法,它覆盖来自超类的方法,如果不存在警告.我的问题:是否有一个与annotate方法相反的标签,我们不想覆盖超类的方法(例如偶然)?
我知道我可以在超类中设置方法final,但是这个解决方案涉及超类代码的更改.这就是我不想做的 - 只想改变我的代码:)
我知道我可以为这个方法设置另一个名字,但有时候在超级类中有很多方法而你根本就没有意识到它们.因此,当您在子类中实现自己的时,可能会偶然使用相同的名称.怎么避免这个?
有什么方法可以将文本锚定或锁定到标记吗?当使用 提供的交互式缩放时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)

我有以下模型类:
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)
但是如果没有货物的记录,它仍然不起作用。
请帮忙。
我的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相反的关系。有没有办法在不对列表进行后处理的情况下做到这一点?
我有以下模型结构:
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 个步骤轻松完成,但在这一点上,更多的是个人对了解其工作原理的好奇心。
我创建了一个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) 我正在对来自 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) 我正在尝试根据 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)
我希望持续时间是一个 …
annotate ×10
django ×7
python ×5
aggregate ×2
matplotlib ×2
datefield ×1
default ×1
java ×1
marker ×1
methods ×1
models ×1
orm ×1
overriding ×1
pagination ×1
plot ×1
sql-order-by ×1
superclass ×1
text ×1
timezone ×1