【问题标题】:Django ORM SELECT with join sql带有连接 sql 的 Django ORM SELECT
【发布时间】:2019-08-12 23:22:09
【问题描述】:

我正在尝试通过与 django ORM 进行连接来获取数据。 但是有一个问题如下。

django 中的模型:

class LawyerCounsel(models.Model):
    lawyer_idx = models.AutoField(primary_key=True)
    lawyer_name = models.CharField(max_length=50)
    lawyer_status = models.CharField(max_length=1)
    register_date = models.DateTimeField()
    lawyeridx = models.ForeignKey(CounselAnswer, to_field='lawyer_idx',
unique='true', db_column="counsel_answer_idx", on_delete="models.DO_NOTHING")

        class Meta:
            managed = False
            db_table = 'lawyer'


class CounselAnswer(models.Model):
    counsel_answer_idx = models.AutoField(primary_key=True)
    counsel_idx = models.IntegerField()
    lawyer_idx = models.IntegerField()
    counsel_answer_title = models.CharField(max_length=255)
    counsel_answer_contents = models.TextField()
    counsel_seleted = models.CharField(max_length=1)
    counsel_answer_agree = models.IntegerField()
    lawyer_ip = models.CharField(max_length=20, blank=True, null=True)
    counsel_answer_delay_time = models.IntegerField()
    register_date = models.DateTimeField()
    update_date = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'counsel_answer'

我需要从数据库中选择

stats_data_test = LawyerCounsel.objects.filter(register_date=yearmonth).order_by("cnt")

我可以使用 django ORM 进行选择吗? (例如在 SQL 中选择看起来像这样)

select * from (
            select 
                y.lawyer_name,
                DATE_FORMAT(y.register_date, '%Y-%m-%d') as reg_date,
                (select count(counsel_answer_idx) from counsel_answer where lawyer_idx = y.lawyer_idx and DATE_FORMAT(register_date, "%Y%m") = '201903') as cnt,
                (select count(counsel_answer_idx) from counsel_answer where lawyer_idx = y.lawyer_idx and DATE_FORMAT(register_date, "%Y%m") = '201903' and week(register_date,5) - week(DATE_SUB(register_date,INTERVAL DAYOFMONTH(register_date)-1 DAY),5) = 1) as cnt1,
                (select count(counsel_answer_idx) from counsel_answer where lawyer_idx = y.lawyer_idx and DATE_FORMAT(register_date, "%Y%m") = '201903' and week(register_date,5) - week(DATE_SUB(register_date,INTERVAL DAYOFMONTH(register_date)-1 DAY),5) = 2) as cnt2,
                (select count(counsel_answer_idx) from counsel_answer where lawyer_idx = y.lawyer_idx and DATE_FORMAT(register_date, "%Y%m") = '201903' and week(register_date,5) - week(DATE_SUB(register_date,INTERVAL DAYOFMONTH(register_date)-1 DAY),5) = 3) as cnt3,
                (select count(counsel_answer_idx) from counsel_answer where lawyer_idx = y.lawyer_idx and DATE_FORMAT(register_date, "%Y%m") = '201903' and week(register_date,5) - week(DATE_SUB(register_date,INTERVAL DAYOFMONTH(register_date)-1 DAY),5) = 4) as cnt4,
                (select count(counsel_answer_idx) from counsel_answer where lawyer_idx = y.lawyer_idx and DATE_FORMAT(register_date, "%Y%m") = '201903' and week(register_date,5) - week(DATE_SUB(register_date,INTERVAL DAYOFMONTH(register_date)-1 DAY),5) = 5) as cnt5,
                (select count(counsel_answer_idx) from counsel_answer where lawyer_idx = y.lawyer_idx and DATE_FORMAT(register_date, "%Y%m") = '201903' and week(register_date,5) - week(DATE_SUB(register_date,INTERVAL DAYOFMONTH(register_date)-1 DAY),5) = 6) as cnt6
            from lawyer y
        where y.lawyer_status = 'N'
        ) A order by A.cnt desc;

【问题讨论】:

  • 您可能可以使用 django 的“注释”功能,但我很难理解您的查询在做什么。你能提供一个示例输出并描述它吗?
  • 律师1 2017-09-04 13 0 0 6 7 0 0 律师2 2017-09-04 0 0 0 0 0 0 0 律师3 2017-09-11 0 0 0 0 0 0 0 显示答案由律师在 counter_answer 表中计数。 cnt 是本月的病例数,cnt1 是第一周....

标签: django django-admin


【解决方案1】:

是的,您可以这样做。您需要使用 Django QuerySet .annotate 功能将这些选择子查询注释到您的模型中。

值被注解到 QuerySet 后,.order_by 可以访问。

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 2015-06-22
    • 2018-10-10
    • 2012-02-07
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多