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
不是必需的,但在这里它实际上是一个好主意!)