想象一下你有这个模型:
class Category(models.Model):
node_id = models.IntegerField(primary_key = True)
type_id = models.IntegerField(max_length = 20)
parent_id = models.IntegerField(max_length = 20)
sort_order = models.IntegerField(max_length = 20)
name = models.CharField(max_length = 45)
lft = models.IntegerField(max_length = 20)
rgt = models.IntegerField(max_length = 20)
depth = models.IntegerField(max_length = 20)
added_on = models.DateTimeField(auto_now = True)
updated_on = models.DateTimeField(auto_now = True)
status = models.IntegerField(max_length = 20)
node = models.ForeignKey(Category_info, verbose_name = 'Category_info', to_field = 'node_id'
重要的部分是外键。 当我尝试:
Category.objects.filter(type_id = 15, parent_id = offset, status = 1)
我得到一个错误,返回的类别超过了类别,这很好,因为它应该返回多个。但我想通过另一个字段过滤结果,该字段是类型id(来自第二个模型)
这是:
class Category_info(models.Model):
objtree_label_id = models.AutoField(primary_key = True)
node_id = models.IntegerField(unique = True)
language_id = models.IntegerField()
label = models.CharField(max_length = 255)
type_id = models.IntegerField()
type_id可以是1到5之间的任何数字。我绝对只想获得一个type_id为1的结果。
这是我想要的sql:
SELECT c.*, ci.*
FROM category c
JOIN category_info ci ON (c.node_id = ci.node_id)
WHERE c.type_id = 15 AND c.parent_id = 50 AND ci.type_id = 1
非常感谢任何帮助。
此致
答案 0 :(得分:4)
要过滤相关表格中的字段,请使用双下划线表示法。要获取相关Category
对象的type_id
为15的所有Category_info
个对象,请使用:
Category.objects.filter(node__type_id=15)
然后,Django将自动了解您所指的type_id
字段与node
相关的任何字段。
答案 1 :(得分:0)
所以它仍然没有解决我的问题。让我试着解释一下。
让我们说sql:
SELECT c.*, ci.*
FROM category c
JOIN category_info ci ON (c.node_id = ci.node_id)
WHERE c.type_id = 15 AND c.parent_id = 50
将返回两行。两者都是相同的,除了category_info表中的type_id字段,其中有两种类型 - 1和2.如果我将添加到sql - ci.type_id = 1,我将得到正确的结果。但是根据我的尝试,即使使用双引号表示法,它仍然会在Django中返回2行。
现在我有了:
Category.objects.filter(type_id = 15, parent_id = offset, status = 1, node__type_id = 1)
node__type_id = 1表示“ci.type_id = 1”。但它仍然会返回两行。当我从模型定义中删除“to_field”时,它将通过,但返回错误的数据,因为它默认将它绑定到主键。我试图通过链接另一个过滤器来过滤数据,但仍然不会过去。
以下是调试的一点,也许有帮助:
Caught an exception while rendering: get() returned more than one Category_info -- it returned 2! Lookup parameters were {'node_id__exact': 5379L}
它看起来仍然只是尝试查找node_id而不是type_id。
叹息,我可以哭...答案 2 :(得分:0)
好的......
select_related()和下划线的东西很好用......