外键问题

2024-09-09 13:10:57 发布

您现在位置:Python中文网/ 问答频道 /正文

假设你有这个模型:

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'

重要的是外键。 当我尝试:

^{pr2}$

我得到了一个错误,返回的比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之间的任何数字。我绝望地试图只得到一个结果,其中类型\u 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

非常感谢任何帮助。在

问候


Tags: 模型infociidnodetruemodelmodels
3条回答

所以还是没能解决我的问题。。让我再解释一下。在

假设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\U id=1,我会得到正确的结果。但从我所尝试的来看,即使使用了双下划线表示法,它仍然以Django返回2行。在

现在我有了:

^{pr2}$

其中node_yutype_id=1表示“ci.type\U id=1英寸。但它仍然返回两行。当我将从模型定义中删除“to_field”时,它将传递,但返回错误的数据,因为默认情况下它将绑定到主键。之后我试图通过链接另一个过滤器来过滤数据,但仍然无法通过。在

下面是一个调试程序,可能有助于:

^{3}$

它似乎仍然试图只查找节点的标识而不是类型的标识

唉,我可以哭。。。在

若要筛选相关表中的字段,请使用双下划线表示法。要获取相关的Category_info对象的type_id为15的所有Category对象,请使用:

Category.objects.filter(node__type_id=15)

Django将自动理解您引用的是与node相关的任何表上的type_id字段。在

好吧所以。。。在

select\u related()与下划线一起使用效果很好。。。在

相关问题 更多 >