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.
精彩评论