将 SQLQuery 转换为 django 查询

Posted

技术标签:

【中文标题】将 SQLQuery 转换为 django 查询【英文标题】:convert SQLQuery into django query 【发布时间】:2018-05-07 10:20:37 【问题描述】:

如何将此查询转换为 django 查询集?

SELECT body, ( SELECT COUNT(status_id) FROM queue WHERE queue.primary_ref_id = messages.Id AND status_id = 2) as count FROM messages

我是 django 框架的新手。请帮我解决这个问题..

这是我的队列模型:

class Queue(models.Model):
possible_action = models.ForeignKey(PossibleActions)
primary_ref = models.ForeignKey(Message)
secondary_ref = models.ForeignKey(Contacts)
status = models.ForeignKey(Statuses)
created_at = models.DateTimeField(blank=True, null=True)
updated_at = models.DateTimeField()

class Meta:
    managed = False
    db_table = 'queue'

def __str__(self):
    return str(self.possible_action) + str(self.status) + str(self.primary_ref) + str(self.secondary_ref)

这是我的消息模型:

class Message(models.Model):
id = models.AutoField(primary_key=True)
body = models.TextField()
phone_regex = RegexValidator(regex=r'^\+?1?\d9,15$',
                             message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
cell_number = models.CharField(validators=[phone_regex], max_length=15, blank=True)
received_at = models.DateTimeField(blank=True, null=True)
created_at = models.DateTimeField(blank=True, null=True)
updated_at = models.DateTimeField()
device_id = models.IntegerField()


class Meta:
    managed = False
    db_table = 'messages'

def __unicode__(self):
    return str(self.body) + str(self.cell_number)

更新的解决方案: 这是我的搜索:

Message.objects.extra(
    select=
        'published_entry_count': "SELECT COUNT(status_id) FROM queue WHERE queue.primary_ref_id = messages.Id AND status_id = 2"
    ,
    where=["(SELECT COUNT(status_id) FROM queue WHERE queue.primary_ref_id = messages.Id AND status_id = 2) < 1"]

)

这就是我想要的,但问题仍然是它不会向我显示所有消息。它只显示那些计数为 0 的人。

【问题讨论】:

你的 Django 模型是什么样的,你的数据库表的结构是什么?另外,在这种情况下,bodystatus_id 是什么? @bouteillebleu 我已经编辑了我的帖子.. 【参考方案1】:

你可以像这样在 Django 中编写 sql 查询

Model.object.raw('SELECT body, ( SELECT COUNT(status_id) FROM queue WHERE queue.primary_ref_id = messages.Id AND status_id = 2) as count FROM messages')

【讨论】:

AttributeError: type object 'Model' has no attribute 'objects' InvalidQuery:原始查询必须包含主键

以上是关于将 SQLQuery 转换为 django 查询的主要内容,如果未能解决你的问题,请参考以下文章

R将查询输出转换为表

查询将查询转换为HTML并通过电子邮件发送

如何将 SQL 查询转换为 HiveSQL 并获取最小日期?

需要将 SQL Query 转换为 Gorm 查询

将 PHP SQL 转换为 Laravel 查询构建器 [重复]

将 Django 过滤器转换为 RAW SQL 查询 [重复]