开发者

Querying across database tables

I've got Django tables like the following (I've removed non-essential fields):

class Person(models.Model):
    nameidx = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=300, verbose_name="Name")     
class Owner(models.Model):
    id = models.IntegerField(primary_key=True) 
    nameidx = models.IntegerField(null=True, blank=True) # is Person.nameidx
    structidx = models.IntegerField() # is PlaceRef.structidx
class PlaceRef(models.Model):
    id = models.IntegerField(primary_key=True) 
   开发者_开发问答 structidx = models.IntegerField() # used for many things and not equivalent to placeidx
    placeidx = models.IntegerField(null=True, blank=True) # is Place.placeidx
class Place(models.Model):
    placeidx = models.IntegerField(primary_key=True) 
    county = models.CharField(max_length=36, null=True, blank=True)
    name = models.CharField(max_length=300)

My question is as follows. If in my views.py file, I have a Person referenced by name and I want to find out all the Places they own as a QuerySet, what should I do?

I can get this far:

person = Person.objects.get(name=name)
owned_relations = Owner.objects.filter(nameidx=nameidx)

How do I get from here to Place? Should I use database methods?

I'm also not sure if I should be using ForeignKey for e.g. Owner.nameidx.

Thanks and apologies for this extremely basic question. I'm not sure how to learn the basics of database queries except by trying, failing, asking SO, trying again... :)


The whole point of foreign keys is for uses like yours. If you already know that Owner.nameidx refers to a Person, why not make it a foreign key (or a OneToOne field) to the Person table? Not only do you get the advantage of referential integrity - it makes it impossible to enter a value for nameidx that isn't a valid Person - the Django ORM will give you the ability to 'follow' the relationships easily:

owned_places = Place.objects.filter(placeref__owner__person=my_person)

will give you all the places owned by my_person.

Incidentally, you don't need to define the separate primary key fields - Django will do it for you, and make them autoincrement fields, which is almost always what you want.


If u could redesign.Then

 In owner nameidx can be a foreign key to Person(nameidx)
 Placeref(structidx) could be a foreign key to Owner(structidx) and 
 Place(placeidx) could be a foreign key Place ref(placeidx)

Then u could deduce the place value easily..

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜