标签: django-orm

姜戈 ORM。加入子查询

我有一个表格,其中包含一些网站的列表和一个包含它们的统计信息的表格。

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_datestats表格。因为在这种情况下,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 join left-join django-orm django-managers

9
推荐指数
3
解决办法
9546
查看次数

我们可以在 Django ORM 中对 CharField 进行求和吗?

我在 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为此使用。

django django-orm

9
推荐指数
1
解决办法
1901
查看次数

Django:注释缺失的日期

我想知道在特定时间段内我每天收到多少订单。

我的订单模型如下所示:

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)

知道我该怎么做吗?

django django-orm

9
推荐指数
1
解决办法
258
查看次数

如何使用使用不同类型的多个字段的 graphene-django 和 Relay 创建自定义过滤器?

问题

你好,

我在 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)

python django django-orm django-filter graphene-django

9
推荐指数
1
解决办法
1751
查看次数

Django ORM:相当于 SQL`NOT IN`?`exclude` 和 `Q` 对象不起作用

问题

我正在尝试使用 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)

python django postgresql django-models django-orm

9
推荐指数
1
解决办法
906
查看次数

Django - 从子查询中注释多个字段

我正在处理一个 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 的几个字段),这对我来说是一个微不足道的问题。

提前感谢您的任何帮助!

python django django-orm django-rest-framework

9
推荐指数
1
解决办法
4078
查看次数

获取 Django 中 .exists() 查询生成的 SQL 语句

是否可以在 Django 中打印由 queryset.exists() 语句生成的 SQL?

django django-orm

8
推荐指数
1
解决办法
2062
查看次数

在Django Admin中使用DateTimeField保存模型实例会失去微秒的分辨率

在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字段在保存回数据库时将失去微秒分辨率.

大多数应用程序不需要那么高的准确度,但对于需要这样的应用程序,能够消除这种分辨率损失的所有可能原因将是很好的.是否有任何已知的方法/功能来防止这种情况或这是一个错误/限制?

python django django-models django-orm django-admin

8
推荐指数
1
解决办法
1204
查看次数

DJango 包含在 JSONField 上不起作用

我已经创建了这样的模型:

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。

python django django-orm

8
推荐指数
2
解决办法
3894
查看次数

Django ORM,如何使用values()并仍然可以使用choicefield?

我正在使用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_modelPallet.
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-DelawareCD-Delaware

请记住,main_model根据我在数据库中存储的内容,可以是任何内容. …

python django django-orm django-queryset choicefield

8
推荐指数
1
解决办法
656
查看次数