Django外键查询

11
在下面的模型中:
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个回答

22

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

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

这将为您提供与mycriteria对象相关的所有选项header对象。

另外,关于风格的说明:正如ironfroggy指出的那样,您不应该在外键字段中使用id,而且您应该使用大写字母样式来定义模型类,这样您就可以区分类Criteria和特定实例criteria之间的差异。

在链接方面,Django文档非常好,并解释了所有这些内容。


10

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

options.objects.filter(header=a_header)

您可以像查询任何值一样进行查询,其中某个标头实例是您要过滤的值。


5

我建议尝试使用更像Django文档中的模型(Models)命名约定和编码风格。以下是一个例子:

coding styleModels
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)

对于多对一关系的文档还引用了一个使用示例


5
听起来你正在寻找反向关系
您可以获取要过滤的标头对象,然后使用类似以下内容的语句:
obj = Header.objects.get(title="value-mart", "createdby=CEO")
obj.criteria_set.all()

查看更详细的信息,请参阅文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接