2010-10-16 27 views
0

我有Django的表像下面的(我已经删除非必要的字段):查询整个数据库表

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) 

我的问题如下。如果在我的views.py文件中,我有一个由名称引用的Person,并且我想查找它们拥有的所有地方作为QuerySet,我该怎么办?

我能多远这样的:

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

我如何从这里到什么地方呢?我应该使用数据库方法吗?

我也不确定我是否应该使用ForeignKey来处理Owner.nameidx。

非常感谢这位非常基本的问题并对此表示歉意。我不知道如何学习数据库查询的基础知识,除了通过尝试,失败,问,就重新尝试... :)

回答

1

外键的整点是像你的使用。如果您已经知道Owner.nameidx引用了Person,为什么不将它作为Person表的外键(或OneToOne字段)呢?你不仅得到引用完整性的优势 - 这使得它不可能输入nameidx的值不是一个有效的人 - Django的ORM会给你“关注”的关系很容易的能力:

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

将为您提供my_person所有的所有地点。顺便说一句,你不需要定义单独的主键字段 - Django会为你做,并使它们成为自动增量字段,这几乎总是你想要的。

+0

感谢您的明确解释 - 这将让生活更轻松:) – AP257 2010-10-17 10:59:35

0

如果ü可以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) 

然后ü可以推断该地方的价值很容易..