开发者

Django Foreign key queries

In the following model:

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_l开发者_开发技巧ength = 255)
    headerid = models.ForeignKey(header)

    def __unicode__(self):
        return self.id()

If there is a row in the database for table header as Id=1, title=value-mart , createdby=CEO

How do I query criteria and options tables to get all the values related to header table id=1

Also can some one please suggest a good link for queries examples.


Ironfroggy is right, but there is another more obvious way to get the relevant options and criteria objects. Django automatically creates a 'reverse relation' for every foreign key pointing at a model, and that is usually the name of the related model plus _set. So:

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

will give you all the options and header objects related to a criteria object mycriteria.

Also, a note on style: as ironfroggy pointed out, you shouldn't use id in the foreign key fields, but also you should use Capitalised style for your model classes, so you can see a difference between the class Criteria and a particular instance criteria.

In terms of links, the Django documentation is excellent and explains all of this.


First of all, don't use id in the names, because it is confusing. That field isn't the ID, it is the object itself. (If you have a field ref it automatically creates a field ref_id)

options.objects.filter(header=a_header)

You query it like any value, where some header instance is the value you are filtering on.


Sounds like you are looking for Following relationships "backward".

You can get the header object you want to filter by, and use something like

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

Look at the documentation for more detailed info


I would suggest trying to us a coding style and naming convention that is more like you see in the Django documentation for Models. Something more like this:

class Header(models.Model):
    ...

class Criteria(models.Model):
    details = model.CharField(max_length=255)
    header = models.ForeignKey(Header)

And then query them as needed:

# 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)

The documentation for many-to-one relationships also references a usage example.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜