我有一个表格,其中包含一些网站的列表和一个包含它们的统计信息的表格。
class Site(models.Model):
domain_name = models.CharField(
max_length=256,
unique=True,
)
class Stats(models.Model):
date = models.DateField()
site = models.ForeignKey('Site')
google_pr = models.PositiveIntegerField()
class Meta:
unique_together = ('site', 'date')
Run Code Online (Sandbox Code Playgroud)
我想查看具体日期的所有站点和统计数据。如果该日期的统计记录不存在,则选择必须仅包含站点。
如果我使用:
Site.objects.filter(stats__date=my_date)
Run Code Online (Sandbox Code Playgroud)
我不会得到它没有记录网站my_date的stats表格。因为在这种情况下,SQL 查询将如下所示:
SELECT *
FROM site
LEFT OUTER JOIN stats ON site.id = stats.site_id
WHERE stats.date = 'my_date'
Run Code Online (Sandbox Code Playgroud)
查询条件将排除日期为 NULL 的记录,没有统计信息的站点将不包括在选择中。
在我的情况下,我需要加入已按日期过滤的统计表:
SELECT *
FROM site
LEFT OUTER JOIN
(SELECT *
FROM stats
WHERE stats.date = 'my-date') AS stats
ON site.id = stats.site_id
Run Code Online (Sandbox Code Playgroud)
如何将此查询转换为 Django ORM?
谢谢。
我在 Django ORM 中的模型是这样的
class Test(Modelbase):
id = models.IntegerField(null=True, blank=True)
amount = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)
我想添加 id 列表的数量。唯一的问题是金额字段是CharField。如何为金额字段申请金额?
Test.objects.filter(id__in=[1,2,3]).aggregate(Sum('amount'))
Run Code Online (Sandbox Code Playgroud)
我正在Django=1.9.1为此使用。
我想知道在特定时间段内我每天收到多少订单。
我的订单模型如下所示:
class Order(models.Model):
...
bookingdate = models.DateTimeField(default=timezone.now)
...
Run Code Online (Sandbox Code Playgroud)
我当前的 Django“查询”看起来像这样:
query = Order.objects.filter(bookingdate__gte=startdate, bookingdate__lte=enddate)
query = query.annotate(created_date=TruncDate('bookingdate')).values('created_date').annotate(
sum=Count('created_date')).values('created_date', 'sum')
Run Code Online (Sandbox Code Playgroud)
我目前的问题是我只列出每天至少发生一个订单的日期。但我还想列出 0 个订单的日期。
例如,我现在得到一个这样的“列表”:
12.12.2018 => 3
14.12.2018 => 1
17.12.2018 => 2
Run Code Online (Sandbox Code Playgroud)
但我也想要介于两者之间的日期。例子:
12.12.2018 => 3
13.12.2018 => 0
14.12.2018 => 1
15.12.2018 => 0
16.12.2018 => 0
17.12.2018 => 2
Run Code Online (Sandbox Code Playgroud)
知道我该怎么做吗?
你好,
我在 Python 3.7 中使用 Graphene Django 和 Graphene Relay。我正在尝试使用 Django 过滤器为 GraphQL 中的请求创建一个自定义过滤器。
我的桌子看起来像这样:
| id(type: int) | flow(type: varchar) | datetime(type: datetime) | duration(type: int) |
|---------------|---------------------|--------------------------|---------------------|
| 1 | aaa | 2019-07-06 08:59:00 | 113095465 |
| 2 | xxx | 2019-07-06 08:59:00 | 113095465 |
| 3 | bbb | 2019-07-06 08:59:00 | 113095465 |
Run Code Online (Sandbox Code Playgroud)
我希望能够使用 GraphQL 执行这种 SQL 请求:
| id(type: int) | flow(type: varchar) | datetime(type: datetime) | duration(type: int) |
|---------------|---------------------|--------------------------|---------------------|
| …Run Code Online (Sandbox Code Playgroud) 问题
我正在尝试使用 Django ORM 来执行 SQLNOT IN子句的等效操作,在子选择中提供 ID 列表以从日志记录表中带回一组记录。我不知道这是否可能。
该模型
class JobLog(models.Model):
job_number = models.BigIntegerField(blank=True, null=True)
name = models.TextField(blank=True, null=True)
username = models.TextField(blank=True, null=True)
event = models.TextField(blank=True, null=True)
time = models.DateTimeField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
我试过的
我的第一次尝试是使用exclude,但这确实NOT否定了整个Subquery,而不是所需的NOT IN:
query = (
JobLog.objects.values(
"username", "job_number", "name", "time",
)
.filter(time__gte=start, time__lte=end, event="delivered")
.exclude(
job_number__in=models.Subquery(
JobLog.objects.values_list("job_number", flat=True).filter(
time__gte=start, time__lte=end, event="finished",
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这产生了这个 SQL:
SELECT "view_job_log"."username", "view_job_log"."group", "view_job_log"."job_number", "view_job_log"."name", "view_job_log"."time"
FROM "view_job_log"
WHERE ( …Run Code Online (Sandbox Code Playgroud) 我正在处理一个 Django 项目,在该项目上我有一个“A”对象(A.objects.all())的查询集,我需要从“B”对象的子查询中注释多个字段。问题是 annotate 方法只能处理每个参数的一种字段类型(DecimalField、CharField 等),因此,为了注释多个字段,我必须使用类似的方法:
A.objects.all().annotate(b_id =Subquery(B_queryset.values('id')[:1],
b_name =Subquery(B_queryset.values('name')[:1],
b_other_field =Subquery(B_queryset.values('other_field')[:1],
... )
Run Code Online (Sandbox Code Playgroud)
这是非常低效的,因为它为我要注释的每个字段在最终 SQL 上创建了一个新的子查询/子选择。我想在它的 values() 参数上使用具有多个字段的相同子选择,并将它们全部注释在 A 的查询集上。我想使用这样的东西:
b_subquery = Subquery(B_queryset.values('id', 'name', 'other_field', ...)[:1])
A.objects.all().annotate(b=b_subquery)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这样做(并访问第一个元素A.objects.all().annotate(b=b_subquery)[0])时,它引发了一个异常:
{FieldError}Expression contains mixed types. You must set output_field.
如果我设置了Subquery(B_quer...[:1], output_field=ForeignKey(B, models.DO_NOTHING)),我会收到一个数据库异常:
{ProgrammingError}subquery must return only one column
简而言之,整个问题是我有多个“属于”A 的 B,所以我需要使用子查询来为每个 AA.objects.all()选择一个特定的 B 并将其附加到该 A 上,使用 OuterRefs 和一些过滤器(我只想要 B 的几个字段),这对我来说是一个微不足道的问题。
提前感谢您的任何帮助!
是否可以在 Django 中打印由 queryset.exists() 语句生成的 SQL?
在Django 1.8中,让我们说我们有这个非常简单的模型:
class Log(models.Model):
remarks = models.TextField()
timestamp = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)
当我将模型实例保存到PostgreSQL数据库时,该timestamp字段将具有微秒.我注意到如果我尝试从Django管理员编辑特定的模型实例,该timestamp字段在保存回数据库时将失去微秒分辨率.
大多数应用程序不需要那么高的准确度,但对于需要这样的应用程序,能够消除这种分辨率损失的所有可能原因将是很好的.是否有任何已知的方法/功能来防止这种情况或这是一个错误/限制?
我已经创建了这样的模型:
class Customer(models.Model):
name = models.CharField(max_length=200)
data = JSONField()
Run Code Online (Sandbox Code Playgroud)
和数据归档具有以下结构:
Customer.objects.create(name='David', data={
'key1': 'text1',
'key2': 'text2',
},
})
Run Code Online (Sandbox Code Playgroud)
问题是当我想通过 contains 查询时,它不返回任何结果。
Customer.objects.filter(data__key1__contains='t')
Run Code Online (Sandbox Code Playgroud)
生成的 sql 查询结果不能为“类似 json”的结构提供正确的 sql。
我正在使用django v1.10.2
我正在尝试创建动态报告,我将字段和条件以及主要的ORM模型信息存储到数据库中.
我生成动态报告的代码是
class_object = class_for_name("app.models", main_model_name)
results = (class_object.objects.filter(**conditions_dict)
.values(*display_columns)
.order_by(*sort_columns)
[:50])
Run Code Online (Sandbox Code Playgroud)
所以main_model_name可以是任何东西.
这除了的,有时相关车型的伟大工程main_model具有choicefield.
所以其中一份报告main_model是Pallet.
Pallet有很多PalletMovement.
我的显示器栏目有:serial_number,created_at,pallet_movement__location
前两列是属于Pallet模型的字段.最后一个来自PalletMovement
会发生什么样的PalletMovement模型看起来像这样:
class PalletMovement(models.Model):
pallet = models.ForeignKey(Pallet, related_name='pallet_movements',
verbose_name=_('Pallet'))
WAREHOUSE_CHOICES = (
('AB', 'AB-Delaware'),
('CD', 'CD-Delaware'),
)
location = models.CharField(choices=WAREHOUSE_CHOICES,
max_length=2,
default='AB',
verbose_name=_('Warehouse Location'))
Run Code Online (Sandbox Code Playgroud)
由于查询集会返回原始值,我如何利用choicefieldin PalletMovement模型来确保pallet_movement__location给出显示的?AB-Delaware或CD-Delaware?
请记住,main_model根据我在数据库中存储的内容,可以是任何内容. …
django ×10
django-orm ×10
python ×6
choicefield ×1
django-admin ×1
join ×1
left-join ×1
postgresql ×1