标签: django-orm

Django - 如何注释不同值的 count()

我有以下模型:

\n
class Bank(model.Model):\n    name: models.CharField\n    ....\n
Run Code Online (Sandbox Code Playgroud)\n

使用以下示例数据:

\n
\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 Row ID, Name \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1, ABC       \xe2\x95\x91\n\xe2\x95\x91 2, ABC       \xe2\x95\x91\n\xe2\x95\x91 3, XYZ       \xe2\x95\x91\n\xe2\x95\x91 4, MNO       \xe2\x95\x91\n\xe2\x95\x91 5, ABC       \xe2\x95\x91\n\xe2\x95\x91 6, DEF       \xe2\x95\x91\n\xe2\x95\x91 7, DEF       \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n

我想提取不同的银行名称,如下所示:

\n
[(\'ABC\', 3), (\'XYZ\', 1), (\'MNO\', 1), (\'DEF\', 2)]\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试使用 annotate 和 distect 但出现以下错误:

\n
NotImplementedError: annotate() + distinct(fields) is not implemented.\n
Run Code Online (Sandbox Code Playgroud)\n

我还遇到了以下问题:

\n

问题1

\n

其中有关于使用的答案models.Count(\'name\', distinct=True),但它返回重复的值。\n我如何使用 Django ORM 处理这个问题?

\n

django django-orm distinct-values

5
推荐指数
2
解决办法
3729
查看次数

如何在 Django ORM 中预取或子查询带有条件的深层嵌套对象

有这些模型和关系:

Hours --FK--> Task --FK--> Project <--FK-- Period

class Hour(models.Model):
  date = models.DateField(...)
  task = models.ForeignKey(Task, ...)

class Task(models.Model):
  project = models.ForeignKey(Project, ...)
  
class Project(models.Model):
  pass

class Period(models.Model):
  project = models.ForeignKey(Project,...)
  start = models.DateField(...)
  end = models.DateField(...)


Summary :
 Hour has one task
 Task has one project
 Period has one project
 Hour has a date
 Period has a start date and a end date
Run Code Online (Sandbox Code Playgroud)

对于给定日期和给定项目,可能有一个时期或没有时期

我想以相同的方式填充对象period中的字段(使用查询集)Hourprefetch_related

我想要这样的东西:

hours = Hour.objects.prefetch_period().all()
hours.first().period # Period(...)
Run Code Online (Sandbox Code Playgroud)

使用像这样的自定义查询集方法:

class HourQuerySet(models.query.QuerySet): …
Run Code Online (Sandbox Code Playgroud)

python django django-orm

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

Django ORM 中的自定义 TruncFunc

我有一个具有以下结构的 Django 模型:

class BBPerformance(models.Model):
    marketcap_change = models.FloatField(verbose_name="marketcap change", null=True, blank=True)
    bb_change = models.FloatField(verbose_name="bestbuy change", null=True, blank=True)
    created_at = models.DateTimeField(verbose_name="created at", auto_now_add=True)
    updated_at = models.DateTimeField(verbose_name="updated at", auto_now=True)
Run Code Online (Sandbox Code Playgroud)

我希望Avg每 3 天对对象进行一次聚合函数。
例如,我编写一个查询集,每天或使用类似TruncDay函数的东西进行此聚合。

queryset = BBPerformance.objects.annotate(day=TruncDay('created_at')).values('day').annotate(marketcap_avg=Avg('marketcap_change'),bb_avg=Avg('bb_change')
Run Code Online (Sandbox Code Playgroud)

如何获得 3 天间隔的聚合值的查询集以及该间隔第二天的索引?

python django postgresql django-orm

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

Django ORM 加入原始查询

我想将一个相当复杂的子查询加入到 Django ORM 查询集中:

结果查询应该是这样的:

select id from webshop_product
left outer join (
    select product_id, count(extra_col) as quantity from (
        select product_id, col1 as extra_col from xyz where x = 123 and y = 456
        union
        select product_id, col2 as extra_col from abc where a = 234 and y = 534
     ) as t1
) as t2 on t2.product_id = webshop_product.id
Run Code Online (Sandbox Code Playgroud)

左外连接子句中的连接子查询非常复杂,它涉及从不同表的联合进行聚合,我无法将其写在ORM中。我尝试在 ORM 中编写它,但是我无法在不同的表上实现 UNION...所以我想将它作为原始子查询加入,并注释数量列。

就像是:

Product.objects.all().join("my complex raw subquery")
Run Code Online (Sandbox Code Playgroud)

这在 Django ORM 中可能吗?

django django-orm

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

使用与现有字段相同的名称注释新字段

我们现在面临这样的情况,我想获得更有经验的用户\xe2\x80\x99s的意见。我们现在是 Django 4、Python 3.9。

\n

目前的情况:

\n

我们的系统已经在生产中运行了一段合理的时间,我们需要根据用户的选择在后端更改一些返回到我们的前端应用程序(Web、mobile\xe2\x80\xa6)的数据。

\n

重要的是:目前无法选择前端方面的更改。

\n

我们需要根据另一个表上现有或不对应的数据覆盖一个模型中的某些属性。

\n

表格(Django 模型):

\n

AgentSearch(该数据每天都会被 ETL 过程替换)

\n
    \n
  • ID
  • \n
  • 标识符号(唯一)
  • \n
  • 成员名字
  • \n
  • 成员姓氏
  • \n
  • 会员邮箱
  • \n
  • 一些其他属性
  • \n
\n

代理(代理可以定义的可选数据)

\n
    \n
  • ID
  • \n
  • agent_search_identifier_number(FK 一对一)
  • \n
  • \n
  • \n
  • 电子邮件
  • \n
\n

对于我们现在的要求,所有查询集都将从 开始进行AgentSearch。这个想法是获取Agent数据,而不是AgentSearch每次有代理链接到数据时就获取数据。

\n

今天我们得到这样的结果:

\n

AgentSearch.objects.all()

\n

我知道像这样注释新列会更容易:

\n
        # using a different attribute name\n        NEW_member_first_name=Case(\n            When(\n                agent__id__isnull=True,\n                then=F("member_first_name"),\n            ),\n            default=F("agent__first_name"),\n        ),\n
Run Code Online (Sandbox Code Playgroud)\n

这将需要我们对前端进行更改。 …

django django-models django-orm django-views django-rest-framework

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

如何在django中检索过去几周的记录

我在django上遇到了如何从上周(不是7天前)检索数据的问题.使用date.isocalendar()[1]会很棒.但是有些stackoverflow浏览导致我没有令人满意的结果.

无论如何,我可以做到没有可移植性并使用mysql的INTERVAL功能.这是我想用django的ORM进行的查询.

SELECT id, user_id, CAST(timestamp AS Date), WEEK(timestamp,3), WEEK(CURDATE(), 3) FROM main_userstats WHERE week(timestamp, 3) = WEEK(DATE_SUB(CURDATE(), INTERVAL 1 WEEK ), 3)

我怎样才能使用extradjango中的函数(如果不可能以任何其他更简单的方式进行)?

mysql django django-orm

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

如何在Django中传递`in`SQL子句的值列表

我需要在我正在编写的Django应用程序中使用原始SQL查询.SQL查询inwhere语句中包含一个子句:

select *
from abc_mymodel
where some_fk in (1,2,3)
and some_status = 'foo'
Run Code Online (Sandbox Code Playgroud)

我是将SQL参数作为参数传递的重要支持者.对于单值的数据,这很容易做到.但是,我不确定如何(或是否)可以为in子句做这件事.理想情况下,我想做的事情如下:

sql = """
    select *
    from abc_mymodel
    where some_fk in %s
    and some_status = %s
"""
my_list = [1,2,3]
my_status = 'foo'
trinkets = MyModel.objects.raw(
    sql,
    params=(my_list, my_status)
)
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用字符串组合来编写in子句并使用参数来表示剩余的值.但是,我很好奇是否可以使用params作为in条款.

database django django-orm

4
推荐指数
1
解决办法
4063
查看次数

独立Django app中的迁移

如何在独立的Django应用程序上进行移动(即,如果有任何项目则不属于该应用程序).

例如,以下内容:https://docs.djangoproject.com/en/1.8/intro/reusable-apps/

django django-models django-orm django-south

4
推荐指数
2
解决办法
584
查看次数

两个字段之间的Timedelta

我正在寻找两个字段之间的timedelta大于特定天数的对象.

在圣诞节,我有一个发送信件的日期,以及收到批准的日期.如果在30天内没有收到批准,那么这些对象应该包含在查询集中.

我可以做类似下面的事情,其中​​delta是静态的.但是我不需要datetime.date.today()作为开始,但需要与其他对象进行比较.

delta = datetime.date.today() - datetime.timedelta(30)
return qs.filter(letter_sent__isnull=False)\
    .filter(approval_from__isnull=True)\
    .filter(letter_sent__gte=delta)
Run Code Online (Sandbox Code Playgroud)

任何指针如何做到这一点?

django django-orm

4
推荐指数
1
解决办法
1427
查看次数

Django ORM在一个查询中加入多对多关系

如果我们有2个具有多对多关系的模型A,B。

我想获得一个类似于此的sql查询:

SELECT *
FROM a LEFT JOIN ab_relation 
ON ab_relation.a_id = a.id
JOIN b ON ab_relation.b_id = b.id;
Run Code Online (Sandbox Code Playgroud)

所以在Django,当我尝试:

A.objects.prefetch_related('bees')
Run Code Online (Sandbox Code Playgroud)

我收到2个类似的查询:

SELECT * FROM a;
SELECT ab_relation.a_id AS prefetch_related_val_a_id, b.* 
FROM b JOIN ab_relation ON b.id = ab_relation.b_id
WHERE ab_relation.a_id IN (123, 456... list of all a.id);
Run Code Online (Sandbox Code Playgroud)

鉴于A和B的表比较大,我发现django的方式满足我的需求太慢了。

问题是:是否可以通过ORM获得左联接手动编写的查询?

编辑以回答一些澄清:

  • 是的LEFT OUTER JOIN,最好是将a放在查询集中,而不仅仅是与B有关系的SQL(更新的sql)。

  • 中等大意味着每个〜4k行,太慢意味着〜3秒(在第一次加载时,在Redis缓存之前。)请记住,页面上还有其他查询。

  • 实际上,是的,我们只需要B.one_field,但是尝试了Prefetch('bees', queryset=B.objects.values('one_field'))一个错误后说您不能values在预取中使用。

  • queryset将用作多选表单域的选项,在这里我们需要用B.field中的额外字符串表示与B有关系的A对象。

django postgresql django-models django-orm

4
推荐指数
1
解决办法
877
查看次数