Django外键查询

时间:2010-03-27 17:12:08

标签: python django django-views django-queryset

在以下模型中:

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

也可以请一些人为查询示例提供一个很好的链接。

4 个答案:

答案 0 :(得分:20)

Ironfroggy是对的,但还有另一种更明显的方法来获取相关的optionscriteria对象。 Django会自动为指向模型的每个外键创建一个“反向关系”,这通常是相关模型的名称加上_set。所以:

mycriteria.options_set.all()
mycriteria.header_set.all()

将为您提供与options对象header相关的所有criteriamycriteria个对象。

另外,关于样式的注释:正如ironfroggy指出的那样,你不应该在外键字段中使用id,而且你应该使用大写样式作为你的模型类,所以你可以看到它们之间的区别类Criteria和特定实例criteria

就链接而言,Django documentation非常出色,并解释了所有这些内容。

答案 1 :(得分:9)

首先,不要在名称中使用id,因为它令人困惑。该字段不是ID,它是对象本身。 (如果您有字段ref,则会自动创建字段ref_id

options.objects.filter(header=a_header)

您可以像任何值一样查询它,其中一些标题实例是您要过滤的值。

答案 2 :(得分:5)

听起来像是在寻找Following relationships "backward"

您可以获取要过滤的标题对象,并使用类似

的内容
obj = Header.objects.get(title="value-mart", "createdby=CEO")
obj.criteria_set.all()

查看documentation了解更多详细信息

答案 3 :(得分:4)

我建议尝试使用coding style和命名约定,这更像你在Models的Django文档中看到的那样。更像是这样:

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