Python 国外关键问题

Python 国外关键问题,python,django,foreign-keys,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_len

假设您有这个模型:

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)
我得到一个返回多于category的错误,这很好,因为它应该返回多于一个。但是我想通过另一个字段过滤结果,该字段是type 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()
类型id可以是1到5之间的任意数字。我绝望地试图只得到一个类型为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
非常感谢您的帮助


关于

要筛选相关表中的字段,请使用双下划线表示法。要获取相关
Category\u info
对象的
type\u id
为15的所有
Category
对象,请使用:

Category.objects.filter(node__type_id=15)

Django将自动理解您在引用与任何表
节点
相关的
type\u id
字段。

要筛选相关表中的字段,请使用双下划线表示法。要获取相关
Category\u info
对象的
type\u id
为15的所有
Category
对象,请使用:

Category.objects.filter(node__type_id=15)

Django将自动理解您在引用与
节点相关的任何表上的
type\u id
字段。

因此它仍然没有解决我的问题。。让我再解释一下

假设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)
其中,节点类型id=1表示“ci.type\U id=1”。但它仍然返回两行。当我从模型定义中删除“to_字段”时,它将通过,但返回错误的数据,因为默认情况下它将其绑定到主键。之后我试图通过链接另一个过滤器来过滤数据,但仍然无法通过

下面是调试的一个小表单,可能有帮助:

Caught an exception while rendering: get() returned more than one Category_info -- it returned 2! Lookup parameters were {'node_id__exact': 5379L}
看起来它仍然试图只查找节点id,而不查找类型id


唉,我可以哭了…

所以它仍然没有解决我的问题。。让我再解释一下

假设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)
其中,节点类型id=1表示“ci.type\U id=1”。但它仍然返回两行。当我从模型定义中删除“to_字段”时,它将通过,但返回错误的数据,因为默认情况下它将其绑定到主键。之后我试图通过链接另一个过滤器来过滤数据,但仍然无法通过

下面是调试的一个小表单,可能有帮助:

Caught an exception while rendering: get() returned more than one Category_info -- it returned 2! Lookup parameters were {'node_id__exact': 5379L}
看起来它仍然试图只查找节点id,而不查找类型id

唉,我会哭…

好吧,所以

选择_related()与下划线一起使用效果很好…

好的,所以


选择_related()和下划线一起使用效果很好…

您的代码格式错误(您需要将所有行缩进4个空格,而不仅仅是第一行)您的代码格式错误(您需要将所有行缩进4个空格,而不仅仅是第一行)谢谢您的快速回答。所以它看起来是这样的:Category.objects.filter(type\u id=15,parent\u id=offset,status=1,node\u\u type\u id=1),因为这不起作用。。。或者我只是工作太多了:s Edit:我对sql做了一点修改,这样可以更好地理解。谢谢你的快速回答。所以它看起来是这样的:Category.objects.filter(type\u id=15,parent\u id=offset,status=1,node\u\u type\u id=1),因为这不起作用。。。或者我只是工作太多了:s Edit:我对sql做了一点修改,这样可以更好地理解它。这看起来像是另一个查询的一个例外。类别信息对象的.get()查询。.filter()将不会提供看起来像来自另一个查询的异常的异常。类别信息对象的.get()查询。A.filter()不会给您提供该异常注意,
select\u related
不是必需的,但在这里它实际上是一个好主意!)请注意,
select_related
不是必需的,但在这里它实际上是一个好主意!)