Django外键查询

Hul*_*ulk 10 python django django-queryset django-views

在以下型号中:

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()
Run Code Online (Sandbox Code Playgroud)

如果数据库中有一行表头为 Id=1, title=value-mart , createdby=CEO

如何查询条件和选项表以获取与标头表id = 1相关的所有值

还有一个人可以为查询示例建议一个很好的链接.

Dan*_*man 20

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

mycriteria.options_set.all()
mycriteria.header_set.all()
Run Code Online (Sandbox Code Playgroud)

将为您提供optionsheader对象相关的所有criteria对象mycriteria.

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

在链接方面,Django文档非常出色,并解释了所有这些.


iro*_*ggy 9

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

options.objects.filter(header=a_header)
Run Code Online (Sandbox Code Playgroud)

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


ist*_*ble 5

我建议尝试使用一种编码风格和命名约定,这更像是您在 Django 文档中看到的Models。更像这样的东西:

class Header(models.Model):
    ...

class Criteria(models.Model):
    details = model.CharField(max_length=255)
    header = models.ForeignKey(Header)
Run Code Online (Sandbox Code Playgroud)

然后根据需要查询它们:

# 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)
Run Code Online (Sandbox Code Playgroud)

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


Flá*_*iro 5

听起来像你正在寻找以下关系"向后".

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

obj = Header.objects.get(title="value-mart", "createdby=CEO")
obj.criteria_set.all()
Run Code Online (Sandbox Code Playgroud)

查看文档以获取更多详细信息