Django 外键查询
Posted
技术标签:
【中文标题】Django 外键查询【英文标题】:Django Foreign key queries 【发布时间】:2011-02-01 13:50:14 【问题描述】:在以下模型中:
class header(models.Model):
title = models.CharField(max_length = 255)
created_by = models.CharField(max_length = 255)
def __unicode__(self):
return self.id()
class criteria(models.Model):
details = models.CharField(max_length = 255)
headerid = models.ForeignKey(header)
def __unicode__(self):
return self.id()
class options(models.Model):
opt_details = models.CharField(max_length = 255)
headerid = models.ForeignKey(header)
def __unicode__(self):
return self.id()
如果数据库中有一行表头为
Id=1, title=value-mart , createdby=CEO
如何查询条件和选项表以获取与标题表相关的所有值 id=1
也有人可以建议一个很好的查询示例链接。
【问题讨论】:
【参考方案1】:Ironfroggy 是对的,但还有另一种更明显的方法可以获取相关的 options
和 criteria
对象。 Django 自动为每个指向模型的外键创建一个“反向关系”,通常是相关模型的名称加上_set
。所以:
mycriteria.options_set.all()
mycriteria.header_set.all()
将为您提供与criteria
对象mycriteria
相关的所有options
和header
对象。
另外,关于样式的说明:正如 ironfroggy 指出的那样,您不应该在外键字段中使用 id
,而且您应该为模型类使用大写样式,这样您就可以看到类之间的区别Criteria
和一个特定的实例 criteria
。
在链接方面,Django documentation 非常出色,并解释了所有这些。
【讨论】:
【参考方案2】:首先,不要在名称中使用id
,因为它会造成混淆。该字段不是 ID,而是对象本身。 (如果你有一个字段ref
,它会自动创建一个字段ref_id
)
options.objects.filter(header=a_header)
您可以像查询任何值一样查询它,其中某个标头实例是您要过滤的值。
【讨论】:
【参考方案3】:听起来您正在寻找Following relationships "backward"。
您可以获取要过滤的标头对象,并使用类似
obj = Header.objects.get(title="value-mart", "createdby=CEO")
obj.criteria_set.all()
查看documentation了解更多详细信息
【讨论】:
【参考方案4】:我建议尝试使用coding style 和命名约定,这更像您在 Django 文档中看到的Models。更像这样的东西:
class Header(models.Model):
...
class Criteria(models.Model):
details = model.CharField(max_length=255)
header = models.ForeignKey(Header)
然后根据需要查询它们:
# find Criteria for a given header
value_mart = Header.objects.get(id=1)
# ... via an instance of Header.
value_mart.criteria_set.all()
# ... or with a filter().
Criteria.objects.filter(header=value_mart)
Criteria.objects.filter(header_id=1)
many-to-one relationships 的文档也引用了usage example。
【讨论】:
以上是关于Django 外键查询的主要内容,如果未能解决你的问题,请参考以下文章