有谁知道通过 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=1
和 list_item_optional.list_item_id = list_item.id
.你能不能不直接应用过滤条件,而是选择它们作为额外的然后过滤?我在没有看到相关模型的情况下写了这个答案。提供模型的源代码会有所帮助。
关于sql - 按计算 (extra()) 字段过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3588378/