Django Foreign key queries

30,147

Solution 1

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.

Solution 2

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.

Solution 3

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

Solution 4

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.

Share:
30,147
Hulk
Author by

Hulk

Updated on September 30, 2020

Comments

  • Hulk
    Hulk over 3 years

    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_length = 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.