sql - 按计算 (extra()) 字段过滤

标签 sql django

有谁知道通过 extra() 方法添加的字段过滤 QuerySet 的方法吗?

例如,这就是我想做的

_list_items = ListItem.objects.filter(list=1).extra(select=
      'SELECT value AS "type" FROM list_item_optional 
       WHERE list_item_optional.list_optional_id=1 
       AND list_item_optional.list_item_id = list_item.id')
_list_items = _list_items.filter(type='A')

我知道上述情况是不允许的,但是 Django 中的解决方法是什么?

同样,也不允许使用原始 SQL 方式执行此操作,例如:SELECT fieldA, fieldB, (SELECT blahblah from tableY WHERE id=1) AS "bla" FROM tableX WHERE "bla" = 'x'
Postgres 中不允许按计算字段进行过滤......有人有解决方法吗?问题变得更大,因为 SQL 语句(QuerySet 检索)是动态的并且仅在运行时定义。

干杯

附上模型:
class List(models.Model):
    account = models.ForeignKey(Account)
    created_date = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(AccountUser, related_name='x10')
    updated_date = models.DateTimeField(null=True, blank=True)
    updated_by = models.ForeignKey(AccountUser, null=True, blank=True, related_name='x11')
    is_deleted = models.BooleanField(default=False)
    name = models.CharField(max_length=50)

    objects_active = DeletedManager()

    class Meta:
        db_table = u'list'

class ListItem(models.Model):
    list = models.ForeignKey(List, db_index=True)
    key = models.CharField(max_length=50)
    name = models.CharField(max_length=100)

    class Meta:
        db_table = u'list_item'
        unique_together = ("list", "key")


class ListOptional(models.Model):
    list = models.ForeignKey(List, db_index=True)
    name = models.CharField(max_length=50)
    is_searchable = models.BooleanField()

    class Meta:
        db_table = u'list_optional'


class ListItemOptional(models.Model):
    list_item = models.ForeignKey(ListItem, null=True, db_index=True)
    list_optional = models.ForeignKey(ListOptional, null=True)
    value = models.CharField(max_length=100)

    class Meta:
        db_table = u'list_item_optional'

最佳答案

SELECT value AS "type" FROM list_item_optional WHERE list_item_optional.list_optional_id=1 AND list_item_optional.list_item_id = list_item.id
WHERE子句是两个条件的组合:list_item_optional.list_optional_id=1list_item_optional.list_item_id = list_item.id .你能不能不直接应用过滤条件,而是选择它们作为额外的然后过滤?我在没有看到相关模型的情况下写了这个答案。提供模型的源代码会有所帮助。

关于sql - 按计算 (extra()) 字段过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3588378/

相关文章:

mysql - MySQL中的乐观锁

php - 插入语句不起作用

mysql - 案例值(value)声明

python - Django:更新未将记录保存到数据库

python - HTML 表格——在标题中放置链接进行排序? (无 JavaScript)

mysql - 错误:mysqlclient的构建轮失败

sql - 通过从不同列中选择随机值来更新列

mysql - 是否可以将具有重复列值的 SELECT 语句中的记录与 SQL 中的另一条记录合并?

django - Amazon S3 的访问被拒绝错误

django - 关系 "django_session"不存在