外键问题

时间:2010-05-04 15:25:53

标签: python django foreign-keys

想象一下你有这个模型:

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

非常感谢任何帮助。

此致

3 个答案:

答案 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()和下划线的东西很好用......